public void GetResponsibleLeader_WithNoSub_ShouldGetActualLeader()
        {
            var leader = new Person()
            {
                Id        = 1,
                FirstName = "Test",
                LastName  = "Testesen",
                Initials  = "TT",
                FullName  = "Test Testesen [TT]"
            };

            var user = new Person()
            {
                Id        = 2,
                FirstName = "User",
                LastName  = "Usersen",
                Initials  = "UU",
                FullName  = "User Usersen [UU]"
            };

            var orgUnit = new OrgUnit()
            {
                Id = 1,
            };

            var leaderEmpl = new Employment()
            {
                Id        = 1,
                OrgUnit   = orgUnit,
                OrgUnitId = 1,
                Person    = leader,
                PersonId  = leader.Id,
                IsLeader  = true
            };

            var userEmpl = new Employment()
            {
                Id        = 2,
                OrgUnit   = orgUnit,
                PersonId  = user.Id,
                OrgUnitId = 1,
                Person    = user,
                IsLeader  = false
            };

            var substitute = new Core.DomainModel.Substitute()
            {
                Id        = 1,
                OrgUnitId = 12,
                PersonId  = 3,
                LeaderId  = 1,
                Sub       = new Person()
                {
                    FullName = "En Substitute [ES]"
                },
                StartDateTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1).AddDays(-1))).TotalSeconds,
                EndDateTimestamp   = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1).AddDays(1))).TotalSeconds,
            };

            _emplMock.AsQueryable().ReturnsForAnyArgs(new List <Employment>()
            {
                leaderEmpl, userEmpl
            }.AsQueryable());

            _orgUnitMock.AsQueryable().ReturnsForAnyArgs(new List <OrgUnit>()
            {
                orgUnit
            }.AsQueryable());

            _subMock.AsQueryable().ReturnsForAnyArgs(new List <Core.DomainModel.Substitute>()
            {
                substitute
            }.AsQueryable());

            var report = new DriveReport()
            {
                Id           = 1,
                Employment   = userEmpl,
                EmploymentId = userEmpl.Id,
                PersonId     = user.Id,
                Person       = user
            };


            var res = _uut.GetResponsibleLeaderForReport(report);

            Assert.AreEqual("Test Testesen [TT]", res.FullName);
        }
        public void GetResponsibleLeader_WithMultipleReports_SomeWithSubSomeWithout_ShouldFindCorrectLeaders()
        {
            var leader1 = new Person()
            {
                Id        = 1,
                FirstName = "Test",
                LastName  = "Testesen",
                Initials  = "TT",
                FullName  = "Test Testesen [TT]"
            };

            var leader2 = new Person()
            {
                Id        = 2,
                FirstName = "Test",
                LastName  = "Tester",
                Initials  = "TT",
                FullName  = "Test Tester [TT]"
            };

            var user1 = new Person()
            {
                Id        = 3,
                FirstName = "User",
                LastName  = "Usersen",
                Initials  = "UU",
                FullName  = "User Usersen [UU]"
            };

            var orgUnit = new OrgUnit()
            {
                Id = 1,
            };

            var orgUnit2 = new OrgUnit()
            {
                Id = 2,
            };

            var leaderEmpl1 = new Employment()
            {
                Id        = 1,
                OrgUnitId = 1,
                OrgUnit   = orgUnit,
                Person    = leader1,
                PersonId  = leader1.Id,
                IsLeader  = true
            };

            var leaderEmpl2 = new Employment()
            {
                Id        = 2,
                OrgUnitId = 2,
                OrgUnit   = orgUnit2,
                Person    = leader2,
                PersonId  = leader2.Id,
                IsLeader  = true
            };

            var userEmpl1 = new Employment()
            {
                Id        = 3,
                OrgUnitId = 1,
                OrgUnit   = orgUnit,
                Person    = user1,
                PersonId  = user1.Id,
                IsLeader  = false
            };

            var userEmpl2 = new Employment()
            {
                Id        = 4,
                OrgUnitId = 2,
                OrgUnit   = orgUnit,
                Person    = user1,
                PersonId  = user1.Id,
                IsLeader  = false
            };



            var substitute = new Core.DomainModel.Substitute()
            {
                Id        = 1,
                PersonId  = 1,
                LeaderId  = 1,
                OrgUnitId = leaderEmpl1.Id,
                Person    = leader1,
                Sub       = new Person()
                {
                    FirstName = "En",
                    LastName  = "Substitute",
                    Initials  = "ES",
                    FullName  = "En Substitute [ES]"
                },
                StartDateTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1).AddDays(1))).TotalSeconds,
                EndDateTimestamp   = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1).AddDays(-1))).TotalSeconds,
            };

            _emplMock.AsQueryable().ReturnsForAnyArgs(new List <Employment>()
            {
                leaderEmpl1, leaderEmpl2, userEmpl1, userEmpl2
            }.AsQueryable());


            _orgUnitMock.AsQueryable().ReturnsForAnyArgs(new List <OrgUnit>()
            {
                orgUnit, orgUnit2
            }.AsQueryable());


            _subMock.AsQueryable().ReturnsForAnyArgs(new List <Core.DomainModel.Substitute>()
            {
                substitute
            }.AsQueryable());



            var report = new List <DriveReport>()
            {
                new DriveReport()
                {
                    Id           = 1,
                    Employment   = userEmpl1,
                    EmploymentId = userEmpl1.Id,
                    PersonId     = user1.Id,
                    Person       = user1,
                },
                new DriveReport()
                {
                    Id           = 2,
                    Employment   = userEmpl1,
                    EmploymentId = userEmpl1.Id,
                    PersonId     = user1.Id,
                    Person       = user1,
                },
                new DriveReport()
                {
                    Id           = 3,
                    Employment   = userEmpl2,
                    EmploymentId = userEmpl2.Id,
                    PersonId     = user1.Id,
                    Person       = user1,
                }
            };


            var res0 = _uut.GetResponsibleLeaderForReport(report.AsQueryable().ElementAt(0));
            var res1 = _uut.GetResponsibleLeaderForReport(report.AsQueryable().ElementAt(1));
            var res2 = _uut.GetResponsibleLeaderForReport(report.AsQueryable().ElementAt(2));

            Assert.AreEqual("En Substitute [ES]", res0.FullName);
            Assert.AreEqual("En Substitute [ES]", res1.FullName);
            Assert.AreEqual("Test Tester [TT]", res2.FullName);
        }
        public void GetResponsibleLeader_LeaderEmplExpired_ShouldReturnParentOrgLeader()
        {
            var leader = new Person()
            {
                Id        = 1,
                FirstName = "Leader1",
                LastName  = "Test",
                Initials  = "TT",
                FullName  = "TestLeader1"
            };

            var leader2 = new Person()
            {
                Id        = 2,
                FirstName = "Leader2",
                LastName  = "Test",
                Initials  = "TT",
                FullName  = "TestLeader2"
            };

            var user = new Person()
            {
                Id        = 3,
                FirstName = "User",
                LastName  = "Usersen",
                Initials  = "UU",
                FullName  = "User Usersen [UU]"
            };

            var orgUnit = new OrgUnit()
            {
                Id = 1,
            };

            var orgUnit2 = new OrgUnit()
            {
                Id       = 2,
                Level    = 1,
                ParentId = orgUnit.Id,
                Parent   = orgUnit
            };

            var leaderEmpl = new Employment()
            {
                Id        = 1,
                OrgUnitId = 1,
                OrgUnit   = orgUnit,
                Person    = leader,
                PersonId  = leader.Id,
                IsLeader  = true
            };

            var leaderEmpl2 = new Employment()
            {
                Id               = 2,
                OrgUnitId        = 2,
                EndDateTimestamp = Utilities.ToUnixTime(DateTime.Today.AddHours(5)),
                OrgUnit          = orgUnit2,
                Person           = leader2,
                PersonId         = leader2.Id,
                IsLeader         = true
            };

            var userEmpl = new Employment()
            {
                Id        = 3,
                OrgUnitId = 2,
                OrgUnit   = orgUnit2,
                Person    = user,
                PersonId  = user.Id,
                IsLeader  = false
            };

            var substitute = new Core.DomainModel.Substitute()
            {
                Id                 = 1,
                PersonId           = leader2.Id,
                Person             = leader2,
                OrgUnitId          = leaderEmpl2.OrgUnitId,
                LeaderId           = leader2.Id,
                SubId              = 3,
                StartDateTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1).AddDays(1))).TotalSeconds,
                EndDateTimestamp   = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1).AddDays(-1))).TotalSeconds,
            };

            _emplMock.AsQueryable().ReturnsForAnyArgs(new List <Employment>()
            {
                leaderEmpl, leaderEmpl2, userEmpl
            }.AsQueryable());

            _orgUnitMock.AsQueryable().ReturnsForAnyArgs(new List <OrgUnit>()
            {
                orgUnit, orgUnit2
            }.AsQueryable());

            _subMock.AsQueryable().ReturnsForAnyArgs(new List <Core.DomainModel.Substitute>()
            {
                substitute
            }.AsQueryable());

            var report = new DriveReport()
            {
                Id           = 1,
                Employment   = userEmpl,
                EmploymentId = userEmpl.Id,
                PersonId     = user.Id,
                Person       = user,
            };


            var res = _uut.GetResponsibleLeadersForReport(report);

            Assert.AreEqual(1, res.Count);
            Assert.AreEqual("TestLeader1", res[0].FullName);
        }
        public void RemoveExpiredLeadersForPendingReports()
        {
            var todayUnix     = Utilities.ToUnixTime(DateTime.Now.AddMinutes(1));
            var tomorrowUnix  = Utilities.ToUnixTime(DateTime.Now.AddDays(1));
            var yesterdayUnix = Utilities.ToUnixTime(DateTime.Now.AddDays(-1));
            var weekAgoUnix   = Utilities.ToUnixTime(DateTime.Now.AddDays(-7));

            var leader1 = new Person()
            {
                Id        = 1,
                FirstName = "Test",
                LastName  = "Testesen",
                Initials  = "TT",
                FullName  = "Test Testesen [TT]"
            };

            var user1 = new Person()
            {
                Id        = 3,
                FirstName = "User",
                LastName  = "Usersen",
                Initials  = "UU",
                FullName  = "User Usersen [UU]"
            };

            var orgUnit = new OrgUnit()
            {
                Id = 1,
            };

            var leaderEmpl1 = new Employment()
            {
                Id        = 1,
                OrgUnitId = 1,
                OrgUnit   = orgUnit,
                Person    = leader1,
                PersonId  = leader1.Id,
                IsLeader  = true
            };

            var userEmpl1 = new Employment()
            {
                Id        = 3,
                OrgUnitId = 1,
                OrgUnit   = orgUnit,
                Person    = user1,
                PersonId  = user1.Id,
                IsLeader  = false
            };

            var substitute = new Core.DomainModel.Substitute()
            {
                Id        = 1,
                PersonId  = 1,
                LeaderId  = 1,
                OrgUnitId = leaderEmpl1.OrgUnitId,
                Person    = leader1,
                Sub       = new Person()
                {
                    Id        = 2,
                    FirstName = "En",
                    LastName  = "Substitute",
                    Initials  = "ES",
                    FullName  = "En Substitute [ES]"
                },
                StartDateTimestamp = weekAgoUnix,
                EndDateTimestamp   = todayUnix,
            };

            var substituteTo = new Core.DomainModel.Substitute()
            {
                Id        = 2,
                PersonId  = 1,
                LeaderId  = 1,
                OrgUnitId = leaderEmpl1.OrgUnitId,
                Person    = leader1,
                Sub       = new Person()
                {
                    Id        = 4,
                    FirstName = "To",
                    LastName  = "Substitute",
                    Initials  = "TS",
                    FullName  = "Tn Substitute [TS]"
                },
                StartDateTimestamp = yesterdayUnix,
                EndDateTimestamp   = yesterdayUnix,
            };

            _emplMock.AsQueryable().ReturnsForAnyArgs(new List <Employment>()
            {
                leaderEmpl1,
                userEmpl1
            }.AsQueryable());

            _orgUnitMock.AsQueryable().ReturnsForAnyArgs(new List <OrgUnit>()
            {
                orgUnit,
            }.AsQueryable());

            _subMock.AsQueryable().ReturnsForAnyArgs(new List <Core.DomainModel.Substitute>()
            {
                substitute,
                substituteTo
            }.AsQueryable());

            var report = new List <DriveReport>()
            {
                new DriveReport()
                {
                    Id           = 1,
                    Employment   = userEmpl1,
                    EmploymentId = userEmpl1.Id,
                    PersonId     = user1.Id,
                    Person       = user1,
                    Status       = ReportStatus.Pending
                },
                new DriveReport()
                {
                    Id           = 2,
                    Employment   = userEmpl1,
                    EmploymentId = userEmpl1.Id,
                    PersonId     = user1.Id,
                    Person       = user1,
                    Status       = ReportStatus.Pending
                }
            };

            var res0 = _uut.GetResponsibleLeadersForReport(report.AsQueryable().ElementAt(0));
            var res1 = _uut.GetResponsibleLeadersForReport(report.AsQueryable().ElementAt(1));

            Assert.AreEqual(2, res0.Count);
            Assert.AreEqual("Test Testesen [TT]", res0[0].FullName);
            Assert.AreEqual("En Substitute [ES]", res0[1].FullName);

            Assert.AreEqual(2, res1.Count);
            Assert.AreEqual("Test Testesen [TT]", res1[0].FullName);
            Assert.AreEqual("En Substitute [ES]", res1[1].FullName);
        }
        public void GetResponsibleLeader_WithMultipleReports_SomeWithSubSomeWithout_ShouldFindCorrectLeaders()
        {
            var todayUnix     = Utilities.ToUnixTime(DateTime.Today.AddDays(1).AddSeconds(-1));
            var tomorrowUnix  = Utilities.ToUnixTime(DateTime.Now.AddDays(1));
            var yesterdayUnix = Utilities.ToUnixTime(DateTime.Now.AddDays(-1));
            var weekAgoUnix   = Utilities.ToUnixTime(DateTime.Now.AddDays(-7));

            var leader1 = new Person()
            {
                Id        = 1,
                FirstName = "Test",
                LastName  = "Testesen",
                Initials  = "TT",
                FullName  = "Test Testesen [TT]"
            };

            var leader2 = new Person()
            {
                Id        = 2,
                FirstName = "Test",
                LastName  = "Tester",
                Initials  = "TT",
                FullName  = "Test Tester [TT]"
            };

            var user1 = new Person()
            {
                Id        = 3,
                FirstName = "User",
                LastName  = "Usersen",
                Initials  = "UU",
                FullName  = "User Usersen [UU]"
            };

            var orgUnit = new OrgUnit()
            {
                Id = 1,
            };

            var orgUnit2 = new OrgUnit()
            {
                Id = 2,
            };

            var leaderEmpl1 = new Employment()
            {
                Id        = 1,
                OrgUnitId = 1,
                OrgUnit   = orgUnit,
                Person    = leader1,
                PersonId  = leader1.Id,
                IsLeader  = true
            };

            var leaderEmpl2 = new Employment()
            {
                Id        = 2,
                OrgUnitId = 2,
                OrgUnit   = orgUnit2,
                Person    = leader2,
                PersonId  = leader2.Id,
                IsLeader  = true
            };

            var userEmpl1 = new Employment()
            {
                Id        = 3,
                OrgUnitId = 1,
                OrgUnit   = orgUnit,
                Person    = user1,
                PersonId  = user1.Id,
                IsLeader  = false
            };

            var userEmpl2 = new Employment()
            {
                Id        = 4,
                OrgUnitId = 2,
                OrgUnit   = orgUnit2,
                Person    = user1,
                PersonId  = user1.Id,
                IsLeader  = false
            };

            var substitute = new Core.DomainModel.Substitute()
            {
                Id        = 1,
                PersonId  = 1,
                LeaderId  = 1,
                OrgUnitId = leaderEmpl1.OrgUnitId,
                Person    = leader1,
                Sub       = new Person()
                {
                    Id        = 1,
                    FirstName = "En",
                    LastName  = "Substitute",
                    Initials  = "ES",
                    FullName  = "En Substitute [ES]"
                },
                StartDateTimestamp = weekAgoUnix,
                EndDateTimestamp   = todayUnix,
            };

            var substituteTo = new Core.DomainModel.Substitute()
            {
                Id        = 2,
                PersonId  = 1,
                LeaderId  = 1,
                OrgUnitId = leaderEmpl1.OrgUnitId,
                Person    = leader1,
                Sub       = new Person()
                {
                    Id        = 2,
                    FirstName = "To",
                    LastName  = "Substitute",
                    Initials  = "TS",
                    FullName  = "Tn Substitute [TS]"
                },
                StartDateTimestamp = yesterdayUnix,
                EndDateTimestamp   = todayUnix,
            };

            var substitute3 = new Core.DomainModel.Substitute()
            {
                Id        = 3,
                PersonId  = 2,
                LeaderId  = 2,
                OrgUnitId = leaderEmpl2.OrgUnitId,
                Person    = leader2,
                Sub       = new Person()
                {
                    Id        = 3,
                    FirstName = "Test",
                    LastName  = "Substitute",
                    Initials  = "TEST",
                    FullName  = "Test Substitute [TEST]"
                },
                StartDateTimestamp = weekAgoUnix,
                EndDateTimestamp   = todayUnix,
            };

            _emplMock.AsQueryable().ReturnsForAnyArgs(new List <Employment>()
            {
                leaderEmpl1,
                leaderEmpl2,
                userEmpl1,
                userEmpl2
            }.AsQueryable());

            _orgUnitMock.AsQueryable().ReturnsForAnyArgs(new List <OrgUnit>()
            {
                orgUnit,
                orgUnit2
            }.AsQueryable());

            _subMock.AsQueryable().ReturnsForAnyArgs(new List <Core.DomainModel.Substitute>()
            {
                substitute,
                substituteTo,
                substitute3
            }.AsQueryable());

            var report = new List <DriveReport>()
            {
                new DriveReport()
                {
                    Id           = 1,
                    Employment   = userEmpl1,
                    EmploymentId = userEmpl1.Id,
                    PersonId     = user1.Id,
                    Person       = user1,
                },
                new DriveReport()
                {
                    Id           = 2,
                    Employment   = userEmpl1,
                    EmploymentId = userEmpl1.Id,
                    PersonId     = user1.Id,
                    Person       = user1,
                },
                new DriveReport()
                {
                    Id           = 3,
                    Employment   = userEmpl2,
                    EmploymentId = userEmpl2.Id,
                    PersonId     = user1.Id,
                    Person       = user1,
                }
            };

            var res0 = _uut.GetResponsibleLeadersForReport(report.AsQueryable().ElementAt(0));
            var res1 = _uut.GetResponsibleLeadersForReport(report.AsQueryable().ElementAt(1));
            var res2 = _uut.GetResponsibleLeadersForReport(report.AsQueryable().ElementAt(2));

            Assert.AreEqual(3, res0.Count);
            Assert.AreEqual("Test Testesen [TT]", res0[0].FullName);
            Assert.AreEqual("En Substitute [ES]", res0[1].FullName);
            Assert.AreEqual("Tn Substitute [TS]", res0[2].FullName);

            Assert.AreEqual(3, res1.Count);
            Assert.AreEqual("Test Testesen [TT]", res1[0].FullName);
            Assert.AreEqual("En Substitute [ES]", res1[1].FullName);
            Assert.AreEqual("Tn Substitute [TS]", res1[2].FullName);

            Assert.AreEqual(2, res2.Count);
            Assert.AreEqual("Test Tester [TT]", res2[0].FullName);
            Assert.AreEqual("Test Substitute [TEST]", res2[1].FullName);
        }