2017-11-09 22:00:05 +01:00
using System ;
using System.Collections.Generic ;
using System.IO ;
using System.Linq ;
using System.Text ;
using System.Threading.Tasks ;
using CalDavSynchronizer.Contracts ;
using CalDavSynchronizer.DataAccess ;
2017-12-21 22:50:55 +01:00
using CalDavSynchronizer.Utilities ;
using Microsoft.Office.Interop.Outlook ;
2017-11-09 22:00:05 +01:00
namespace CalDavSynchronizer.IntegrationTests
{
2017-12-21 22:50:55 +01:00
public class TestOptionsFactory
2017-11-09 22:00:05 +01:00
{
2017-12-21 22:50:55 +01:00
private const string AppointmantFolderName = "IntegrationTestCalendar" ;
private const string TaskFolderName = "IntegrationTestTasks" ;
private const string ContactFolderName = "IntegrationTestContacts" ;
private readonly IOutlookSession _session ;
2017-12-31 18:26:00 +01:00
private readonly IOptionsDataAccess _optionsDataAccess ;
2017-12-21 22:50:55 +01:00
2017-12-31 18:26:00 +01:00
public TestOptionsFactory ( IOutlookSession session , IOptionsDataAccess optionsDataAccess )
2017-12-21 22:50:55 +01:00
{
2017-12-31 18:26:00 +01:00
_optionsDataAccess = optionsDataAccess ? ? throw new ArgumentNullException ( nameof ( optionsDataAccess ) ) ;
2017-12-21 22:50:55 +01:00
_session = session ? ? throw new ArgumentNullException ( nameof ( session ) ) ;
}
public Options CreateSogoEvents ( )
2017-11-09 22:00:05 +01:00
{
2017-12-21 22:50:55 +01:00
var options = CreateDefaultOptions ( "IntegrationTest/Events/Sogo" , AppointmantFolderName ) ;
2017-11-09 22:00:05 +01:00
options . MappingConfiguration = CreateDefaultEventMappingConfiguration ( ) ;
return options ;
}
2017-12-21 22:50:55 +01:00
public Options CreateGoogleEvents ( )
2017-11-09 22:00:05 +01:00
{
2017-12-21 22:50:55 +01:00
var options = CreateDefaultOptions ( "IntegrationTest/Events/Google" , AppointmantFolderName ) ;
2017-11-09 22:00:05 +01:00
options . MappingConfiguration = CreateDefaultEventMappingConfiguration ( ) ;
return options ;
}
2017-12-21 22:50:55 +01:00
public Options CreateSogoContacts ( )
2017-11-09 22:00:05 +01:00
{
2017-12-21 22:50:55 +01:00
var options = CreateDefaultOptions ( "IntegrationTests/Contacts/Sogo" , ContactFolderName ) ;
2017-11-09 22:00:05 +01:00
options . MappingConfiguration = CreateDefaultContactMappingConfiguration ( ) ;
return options ;
}
2017-12-21 22:50:55 +01:00
public Options CreateGoogleContacts ( )
2017-11-09 22:00:05 +01:00
{
2017-12-21 22:50:55 +01:00
var options = CreateDefaultOptions ( "IntegrationTests/Contacts/Google" , ContactFolderName ) ;
2017-11-09 22:00:05 +01:00
options . MappingConfiguration = CreateDefaultContactMappingConfiguration ( ) ;
return options ;
}
2017-12-21 22:50:55 +01:00
public Options CreateSogoTasks ( )
2017-11-09 22:00:05 +01:00
{
2017-12-21 22:50:55 +01:00
var options = CreateDefaultOptions ( "IntegrationTest/Tasks/Sogo" , TaskFolderName ) ;
2017-11-09 22:00:05 +01:00
options . MappingConfiguration = CreateDefaultTaskMappingConfiguration ( ) ;
return options ;
}
2017-12-21 22:50:55 +01:00
public Options CreateGoogleTasks ( )
2017-11-09 22:00:05 +01:00
{
2017-12-21 22:50:55 +01:00
var options = CreateDefaultOptions ( "IntegrationTest/Tasks/Google" , TaskFolderName ) ;
2017-11-09 22:00:05 +01:00
options . MappingConfiguration = CreateDefaultTaskMappingConfiguration ( ) ;
return options ;
}
2017-12-21 23:29:02 +01:00
public Options CreateLocalFolderEvents ( ) = > CreateLocalFolder ( AppointmantFolderName ) ;
private Options CreateLocalFolder ( string outlookFolderName )
{
const string folderPath = @"D:\temp\IntegrationTests\Entities\" ;
if ( ! Directory . Exists ( folderPath ) )
{
Directory . CreateDirectory ( folderPath ) ;
}
else
{
foreach ( var file in Directory . GetFiles ( folderPath ) )
File . Delete ( file ) ;
}
var options = CreateDefaultOptions (
new Options ( ) { CalenderUrl = $"file://{folderPath}" } ,
outlookFolderName ) ;
options . MappingConfiguration = CreateDefaultEventMappingConfiguration ( ) ;
return options ;
}
2017-11-09 22:00:05 +01:00
private static EventMappingConfiguration CreateDefaultEventMappingConfiguration ( )
{
return new EventMappingConfiguration ( ) ;
}
private static MappingConfigurationBase CreateDefaultContactMappingConfiguration ( )
{
return new ContactMappingConfiguration ( ) ;
}
private static MappingConfigurationBase CreateDefaultTaskMappingConfiguration ( )
{
return new TaskMappingConfiguration ( ) ;
}
2017-12-21 22:50:55 +01:00
private Options CreateDefaultOptions ( string profileName , string outlookFolderName )
2017-11-09 22:00:05 +01:00
{
2017-12-31 18:26:00 +01:00
var options = _optionsDataAccess . Load ( ) . Single ( o = > o . Name = = profileName ) ;
2017-12-21 22:50:55 +01:00
return CreateDefaultOptions ( options , outlookFolderName ) ;
}
private Options CreateDefaultOptions ( Options optionsWithConnectionData , string outlookFolderName )
{
var outlookFolder = _session . GetFoldersByName ( ) . GetOrDefault ( outlookFolderName ) ? . SingleOrDefault ( ) ? ? throw new System . Exception ( $"Didn't find single folder {outlookFolderName}" ) ;
2017-11-09 22:00:05 +01:00
return new Options
{
2017-12-21 22:50:55 +01:00
ProtectedPassword = optionsWithConnectionData . ProtectedPassword ,
Salt = optionsWithConnectionData . Salt ,
UserName = optionsWithConnectionData . UserName ,
CalenderUrl = optionsWithConnectionData . CalenderUrl ,
EmailAddress = optionsWithConnectionData . EmailAddress ,
ServerAdapterType = optionsWithConnectionData . ServerAdapterType ,
2018-01-25 19:20:02 +01:00
ForceBasicAuthentication = optionsWithConnectionData . ForceBasicAuthentication ,
CloseAfterEachRequest = optionsWithConnectionData . CloseAfterEachRequest ,
PreemptiveAuthentication = optionsWithConnectionData . PreemptiveAuthentication ,
2017-12-21 22:50:55 +01:00
OutlookFolderEntryId = outlookFolder . EntryId ,
OutlookFolderStoreId = outlookFolder . StoreId ,
2017-11-09 22:00:05 +01:00
IsChunkedSynchronizationEnabled = false ,
ChunkSize = 100 ,
IgnoreSynchronizationTimeRange = true ,
SynchronizationMode = Implementation . SynchronizationMode . MergeInBothDirections ,
ConflictResolution = Implementation . ConflictResolution . Automatic ,
SynchronizationIntervalInMinutes = 0 ,
} ;
}
}
}