public async Task Synchronize_Works_StartWithNotEmplyDb_HQNotEmpty_SalaryIsNotAddedTwice() { var cs = CommonHelpers.MockConfServ(false); var hqApiClient = new Moq.Mock <IHQAPIClient>(); // setup HQ state var hqEmp1 = new HQEmployee { Name = "Jan K", Email = "*****@*****.**", IsManager = false, ID = 1 }; var hqEmp2 = new HQEmployee { Name = "Ela K", Email = "*****@*****.**", IsManager = true, ID = 2 }; var hqEmps = new List <HQEmployee>(); hqEmps.Add(hqEmp1); hqEmps.Add(hqEmp2); hqApiClient.Setup(m => m.ListEmployees(cs.GetBranchOfficeId())).Returns( Task.FromResult(hqEmps) ); var hqSalary1 = new HQSalary { ID = 1, EmployeeID = 2, Value = 1000, TimePeriod = "hqsalary1" }; var hqSalary2 = new HQSalary { ID = 2, EmployeeID = 2, Value = 1000, TimePeriod = "hqsalary2" }; var hqSalaries = new List <HQSalary>(); hqSalaries.Add(hqSalary1); hqSalaries.Add(hqSalary2); hqApiClient.Setup(m => m.ListSalariesForEmployee(2)).Returns( Task.FromResult(hqSalaries) ); var dao = new PostgresDataAccessObjectService(dbContext); // setup BO state var boEmp2 = new Employee { Name = "Ela K", Email = "*****@*****.**", EmployeeId = 5, IsManager = true }; dao.AddEmployee(boEmp2, true); var salary3 = new Salary { SalaryId = 3, EmployeeId = 5, TimePeriod = "hqsalary1", Value = 333 }; dao.AddSalary(salary3, true); var ss = new SynchronizatorService(hqApiClient.Object, cs, dao); await ss.Synchronize(); hqApiClient.Verify(m => m.ListEmployees(0), Moq.Times.Once); // 1 for each hq employee hqApiClient.Verify(m => m.ListSalariesForEmployee(Moq.It.IsAny <int>()), Moq.Times.Exactly(2)); ss.Dispose(); var emps = dao.GetAllEmployees(); var eh = dao.GetAllEmployeeHours(); var salaries = dao.GetAllSalaries(); Assert.Equal(2, emps.Count); Assert.Equal("*****@*****.**", emps[1].Email); Assert.Equal("*****@*****.**", emps[0].Email); Assert.Empty(eh); Assert.Equal(2, salaries.Count); }