public void AddEmployee_WhenEmptyTable()
        {
            var emp = new Employee {
                Name = "Ola 2", Email = "*****@*****.**", EmployeeId = 44
            };

            var dao = new PostgresDataAccessObjectService(dbContext);

            dao.AddEmployee(emp);

            var coll = dao.GetAllEmployees();

            Assert.Single(coll);
            Assert.Equal("Ola 2", coll[0].Name);
            Assert.Equal("*****@*****.**", coll[0].Email);
            Assert.Equal(1, coll[0].EmployeeId);// apparently we must start from 1
        }
        public async Task AddEmployee_WhenNotEmptyTable_KeepId_ConflictingKeyValues()
        {
            await dbContext.Employees.AddAsync(new Employee { Name = "Ola AAA", Email = "*****@*****.**", EmployeeId = 4 });

            await dbContext.SaveChangesAsync();

            var emp = new Employee {
                Name = "Ola 2", Email = "*****@*****.**", EmployeeId = 4
            };

            var  dao      = new PostgresDataAccessObjectService(dbContext);
            bool exThrown = false;

            try {
                exThrown = true;
                dao.AddEmployee(emp, true);
            } catch (Exception ex) {
                Assert.Equal(typeof(ArgumentException), ex.GetType());
                Assert.Equal("Employee with EmployeeId: 4 already exists", ex.Message);
            }
            Assert.True(exThrown);
        }
        public async Task AddEmployee_WhenEmployeeWithSameEmailExists()
        {
            await dbContext.Employees.AddAsync(new Employee { Name = "Ola AAA", Email = "*****@*****.**", EmployeeId = 4 });

            await dbContext.SaveChangesAsync();

            var emp = new Employee {
                Name = "Ola 2", Email = "*****@*****.**", EmployeeId = 44
            };

            var  dao      = new PostgresDataAccessObjectService(dbContext);
            bool exThrown = false;

            try {
                exThrown = true;
                dao.AddEmployee(emp);
            } catch (Exception ex) {
                Assert.Equal(typeof(ArgumentException), ex.GetType());
                Assert.Equal("Employee with email: [email protected] already exists", ex.Message);
            }
            Assert.True(exThrown);
        }
        public async Task AddEmployee_WhenNotEmptyTable()
        {
            await dbContext.Employees.AddAsync(new Employee { Name = "Ola AAA", Email = "*****@*****.**", EmployeeId = 4 });

            await dbContext.SaveChangesAsync();

            var emp = new Employee {
                Name = "Ola 2", Email = "*****@*****.**", EmployeeId = 44
            };

            var dao = new PostgresDataAccessObjectService(dbContext);

            dao.AddEmployee(emp);

            var coll = dao.GetAllEmployees();

            Assert.Equal(2, coll.Count);
            Assert.Equal("Ola AAA", coll[0].Name);
            Assert.Equal("Ola 2", coll[1].Name);
            Assert.Equal("*****@*****.**", coll[0].Email);
            Assert.Equal("*****@*****.**", coll[1].Email);
            Assert.Equal(4, coll[0].EmployeeId);
            Assert.Equal(5, coll[1].EmployeeId);
        }
        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);
        }