public async Task ShouldSuggestLeaveTimeSheet(string date, string categoryId, string comment)
        {
            var json         = File.ReadAllText("Data/timepro-api-crm-mixed-client-leave.json");
            var appointments = JsonConvert.DeserializeObject <CrmAppointmentModel[]>(json);

            json = File.ReadAllText("Data/timepro-api-recent-projects.json");
            var recentProjects = JsonConvert.DeserializeObject <RecentProjectModel[]>(json);

            appointments.Should().NotBeEmpty();

            var query   = new SuggestTimeSheetQuery();
            var request = new SuggestTimeSheetRequest
            {
                Date            = date,
                EmpID           = "JEK",
                CrmAppointments = appointments,
                RecentProjects  = recentProjects
            };

            var result = await query.Execute(request);

            result.Should().NotBeNull();
            result.EmpID.Should().Be("JEK");
            result.ClientID.Should().Be("SSW");
            result.ProjectID.Should().Be("LEAVE");
            result.CategoryID.Should().Be(categoryId);
            result.BillableID.Should().Be("W");
            result.LocationID.Should().Be("SSW");
            result.DateCreated.Should().Be(date);
            result.Comment.Should().Be(comment);
            result.AlreadyHasTimesheet.Should().BeFalse();
        }
        public async Task ShouldSuggestBillableTimeSheet()
        {
            var json         = File.ReadAllText("Data/timepro-api-crm-mixed-client-leave.json");
            var appointments = JsonConvert.DeserializeObject <CrmAppointmentModel[]>(json);

            json = File.ReadAllText("Data/timepro-api-recent-projects.json");
            var recentProjects = JsonConvert.DeserializeObject <RecentProjectModel[]>(json);

            json = File.ReadAllText("Data/timepro-api-commits.json");
            var commits = JsonConvert.DeserializeObject <GitCommitResult>(json);

            appointments.Should().NotBeEmpty();
            commits.data.Should().NotBeEmpty();

            var query   = new SuggestTimeSheetQuery();
            var request = new SuggestTimeSheetRequest
            {
                Date            = "2019-05-07+10",
                EmpID           = "JEK",
                CrmAppointments = appointments,
                RecentProjects  = recentProjects,
                Commits         = commits.data
            };

            var result = await query.Execute(request);

            result.Should().NotBeNull();
            result.EmpID.Should().Be("JEK");
            result.ClientID.Should().Be("T2VV5F");
            result.ProjectID.Should().Be("DG8WXY");
            result.CategoryID.Should().Be("WEBDEV");
            result.BillableID.Should().Be("B");
            result.LocationID.Should().Be("SSW");
            result.DateCreated.Should().Be("2019-05-07");
            result.Comment.Should().Be($"Commits:\n" +
                                       $"- Added perf test proejct.\n" +
                                       $"- Added test for generating seed data.\n" +
                                       $"- Moved perf project from logical folder PL to BL.\n" +
                                       $"- Moved Eplan.ManagementService.Application from root to logical folder BL.\n" +
                                       $"- Connect to the DB test.\n" +
                                       $"- Moved EfCulkSeedPersister to data layer.\n" +
                                       $"- Completed EfBulkSeedPersister refactor to data layer.\n" +
                                       $"- Connect to DB test now clears all tables and verifies if it can execute a SQL statement.\n" +
                                       $"- Added test that do a full seeding process.\n" +
                                       $"- Added DB fixture and converted one test.\n" +
                                       $"- Completed seeding DB and making sure we reuse the DB.\n" +
                                       $"- First \"real\" test.");
            result.SuggestedActions.Should().NotBeNull();
            result.SuggestedActions.SelectProject.Should().BeFalse();
            result.SuggestedActions.EnterDescription.Should().BeFalse();
        }
        public async Task ShouldSuggestBillableTimeSheetWithSuggestedActions()
        {
            var json         = File.ReadAllText("Data/timepro-api-crm-mixed-client-leave.json");
            var appointments = JsonConvert.DeserializeObject <CrmAppointmentModel[]>(json);

            json = File.ReadAllText("Data/timepro-api-recent-projects.json");
            var recentProjects = JsonConvert.DeserializeObject <List <RecentProjectModel> >(json);

            recentProjects.Add(new RecentProjectModel
            {
                Client      = "Awesome Software & Service GmbH&Co.KG",
                ClientID    = "T2VV5F",
                Project     = "Awesome IAM #2",
                ProjectID   = "DG8WXY2",
                Iteration   = null,
                IterationId = null,
                Category    = "Web Site Development",
                CategoryID  = "WEBDEV",
                DateCreated = new System.DateTime(2019, 4, 10)
            });

            json = File.ReadAllText("Data/timepro-api-commits-empty.json");
            var commits = JsonConvert.DeserializeObject <GitCommitResult>(json);

            appointments.Should().NotBeEmpty();

            var query   = new SuggestTimeSheetQuery();
            var request = new SuggestTimeSheetRequest
            {
                Date            = "2019-05-07+10",
                EmpID           = "JEK",
                CrmAppointments = appointments,
                RecentProjects  = recentProjects,
                Commits         = commits.data
            };

            var result = await query.Execute(request);

            result.Should().NotBeNull();
            result.EmpID.Should().Be("JEK");
            result.ClientID.Should().Be("T2VV5F");
            result.ProjectID.Should().Be("DG8WXY");
            result.CategoryID.Should().Be("WEBDEV");
            result.BillableID.Should().Be("B");
            result.LocationID.Should().Be("SSW");
            result.DateCreated.Should().Be("2019-05-07");
            result.Comment.Should().BeNullOrEmpty();
            result.SuggestedActions.Should().NotBeNull();
            result.SuggestedActions.SelectProject.Should().BeTrue();
            result.SuggestedActions.EnterDescription.Should().BeTrue();
        }
        public async Task ShouldAlreadyHaveTimesheet()
        {
            string date       = "2019-05-06";
            string categoryId = "LNWD";
            string comment    = "SSW (SSW) - Labour Day public holiday (QLD only)";

            var json         = File.ReadAllText("Data/timepro-api-crm-mixed-client-leave.json");
            var appointments = JsonConvert.DeserializeObject <CrmAppointmentModel[]>(json);

            json = File.ReadAllText("Data/timepro-api-recent-projects.json");
            var recentProjects = JsonConvert.DeserializeObject <RecentProjectModel[]>(json);

            appointments.Should().NotBeEmpty();

            var query   = new SuggestTimeSheetQuery();
            var request = new SuggestTimeSheetRequest
            {
                Date            = date,
                EmpID           = "JEK",
                CrmAppointments = appointments,
                RecentProjects  = recentProjects,
                Timesheets      = new List <TimesheetModel>
                {
                    new TimesheetModel
                    {
                        id    = 729994442,
                        title = "SSW (SSW) - Labour Day public holiday (QLD only)"
                    }
                }
            };

            var result = await query.Execute(request);

            result.Should().NotBeNull();
            result.EmpID.Should().Be("JEK");
            result.ClientID.Should().Be("SSW");
            result.ProjectID.Should().Be("LEAVE");
            result.CategoryID.Should().Be(categoryId);
            result.BillableID.Should().Be("W");
            result.LocationID.Should().Be("SSW");
            result.DateCreated.Should().Be(date);
            result.Comment.Should().Be(comment);
            result.AlreadyHasTimesheet.Should().BeTrue();
        }
        public async Task ShouldSuggestBillableTimeSheetWithNoDescription()
        {
            var json         = File.ReadAllText("Data/timepro-api-crm-mixed-client-leave.json");
            var appointments = JsonConvert.DeserializeObject <CrmAppointmentModel[]>(json);

            json = File.ReadAllText("Data/timepro-api-recent-projects.json");
            var recentProjects = JsonConvert.DeserializeObject <RecentProjectModel[]>(json);

            json = File.ReadAllText("Data/timepro-api-commits-empty.json");
            var commits = JsonConvert.DeserializeObject <GitCommitResult>(json);

            appointments.Should().NotBeEmpty();

            var query   = new SuggestTimeSheetQuery();
            var request = new SuggestTimeSheetRequest
            {
                Date            = "2019-05-07+10",
                EmpID           = "JEK",
                CrmAppointments = appointments,
                RecentProjects  = recentProjects,
                Commits         = commits.data
            };

            var result = await query.Execute(request);

            result.Should().NotBeNull();
            result.EmpID.Should().Be("JEK");
            result.ClientID.Should().Be("T2VV5F");
            result.ProjectID.Should().Be("DG8WXY");
            result.CategoryID.Should().Be("WEBDEV");
            result.BillableID.Should().Be("B");
            result.LocationID.Should().Be("SSW");
            result.DateCreated.Should().Be("2019-05-07");
            result.Comment.Should().BeNullOrEmpty();
            result.SuggestedActions.Should().NotBeNull();
            result.SuggestedActions.SelectProject.Should().BeFalse();
            result.SuggestedActions.EnterDescription.Should().BeTrue();
        }
        public async Task ShouldSuggestInternalWorkTimeSheet(string gitCommitsFile, string date, string projectId, string categoryId, string comment, bool shouldSelectProject, bool shouldEnterDescription)
        {
            var json         = File.ReadAllText("Data/timepro-api-crm-mixed-client-leave.json");
            var appointments = JsonConvert.DeserializeObject <CrmAppointmentModel[]>(json);

            json = File.ReadAllText("Data/timepro-api-recent-projects.json");
            var recentProjects = JsonConvert.DeserializeObject <RecentProjectModel[]>(json);

            json = File.ReadAllText(gitCommitsFile);
            var commits = JsonConvert.DeserializeObject <GitCommitResult>(json);

            appointments.Should().NotBeEmpty();

            var query   = new SuggestTimeSheetQuery();
            var request = new SuggestTimeSheetRequest
            {
                Date            = date + "+10",
                EmpID           = "JEK",
                CrmAppointments = appointments,
                RecentProjects  = recentProjects,
                Commits         = commits.data
            };

            var result = await query.Execute(request);

            result.Should().NotBeNull();
            result.EmpID.Should().Be("JEK");
            result.ClientID.Should().Be("SSW");
            result.ProjectID.Should().Be(projectId);
            result.CategoryID.Should().Be(categoryId);
            result.BillableID.Should().Be("W");
            result.LocationID.Should().Be("SSW");
            result.DateCreated.Should().Be(date);
            result.Comment.Should().Be(comment);
            result.SuggestedActions.Should().NotBeNull();
            result.SuggestedActions.SelectProject.Should().Be(shouldSelectProject);
            result.SuggestedActions.EnterDescription.Should().Be(shouldEnterDescription);
        }