public async Task ReadByDateAndUserAsync_Should_Filter_By_UserId()
        {
            var teamId     = Guid.NewGuid();
            var userId1    = Guid.NewGuid();
            var userId2    = Guid.NewGuid();
            var reportDate = new DateTime(2019, 1, 14);
            var reportDateItemIdentifier = new ReportDateItemIdentifier
            {
                TeamId = teamId,
                Date   = reportDate,
                UserId = userId1
            };
            var reportTask1 = new ReportTask
            {
                Id                 = Guid.NewGuid(),
                CurrentState       = "some state",
                Problems           = "some problems",
                Url                = "some url",
                Theme              = "some theme",
                IsPublic           = true,
                DateItemIdentifier = reportDateItemIdentifier
            };
            var reportTask2 = new ReportTask
            {
                Id                 = Guid.NewGuid(),
                CurrentState       = "some state2",
                Problems           = "some problems2",
                Url                = "some url2",
                Theme              = "some theme2",
                IsPublic           = true,
                DateItemIdentifier = new ReportDateItemIdentifier
                {
                    Date   = reportDateItemIdentifier.Date,
                    UserId = userId2,
                    TeamId = reportDateItemIdentifier.TeamId
                }
            };
            var reportTask3 = new ReportTask
            {
                Id                 = Guid.NewGuid(),
                CurrentState       = "some state3",
                Problems           = "some problems",
                Url                = "some url3",
                Theme              = "some theme3",
                IsPublic           = true,
                DateItemIdentifier = reportDateItemIdentifier
            };

            await repository.SaveAsync(reportTask1).ConfigureAwait(false);

            await repository.SaveAsync(reportTask2).ConfigureAwait(false);

            await repository.SaveAsync(reportTask3).ConfigureAwait(false);

            var readedTask = await repository.ReadByDateAndUserAsync(reportDateItemIdentifier, true).ConfigureAwait(false);

            readedTask.Should().BeEquivalentTo(new List <ReportTask> {
                reportTask1, reportTask3
            });
        }
        public async Task ReadByDateAndUserAsync_Should_Return_Exactly_Saved_Task()
        {
            var teamId     = Guid.NewGuid();
            var userId     = Guid.NewGuid();
            var reportDate = new DateTime(2019, 1, 14);
            var reportDateItemIdentifier = new ReportDateItemIdentifier
            {
                TeamId = teamId,
                Date   = reportDate,
                UserId = userId
            };
            var reportTask = new ReportTask
            {
                Id                 = Guid.NewGuid(),
                CurrentState       = "some state",
                Problems           = "some problems",
                Url                = "some url",
                Theme              = "some theme",
                IsPublic           = true,
                DateItemIdentifier = reportDateItemIdentifier
            };

            await repository.SaveAsync(reportTask).ConfigureAwait(false);

            var readedTask = await repository.ReadByDateAndUserAsync(reportDateItemIdentifier, true).ConfigureAwait(false);

            readedTask.Should().BeEquivalentTo(reportTask);
        }
        public async Task DeleteAsync_Should_Do_Nothing_When_Trying_To_Delete_Absent_Task()
        {
            var reportDateItemIdentifier = new ReportDateItemIdentifier
            {
                TeamId = Guid.NewGuid(),
                Date   = new DateTime(2019, 1, 14),
                UserId = Guid.NewGuid()
            };
            var taskId1     = Guid.NewGuid();
            var reportTask1 = new ReportTask
            {
                Id                 = taskId1,
                CurrentState       = "some state",
                Problems           = "some problems",
                Url                = "some url",
                Theme              = "some theme",
                IsPublic           = true,
                DateItemIdentifier = reportDateItemIdentifier
            };
            var reportTask2 = new ReportTask
            {
                Id                 = Guid.NewGuid(),
                CurrentState       = "some state2",
                Problems           = "some problems2",
                Url                = "some url2",
                Theme              = "some theme2",
                IsPublic           = true,
                DateItemIdentifier = reportDateItemIdentifier
            };

            await repository.SaveAsync(reportTask1).ConfigureAwait(false);

            await repository.SaveAsync(reportTask2).ConfigureAwait(false);

            await repository.DeleteAsync(Guid.NewGuid()).ConfigureAwait(false);

            var readedTask = await repository.ReadByDateAsync(reportDateItemIdentifier.TeamId, reportDateItemIdentifier.Date, true).ConfigureAwait(false);

            readedTask.Should().BeEquivalentTo(new List <ReportTask> {
                reportTask1, reportTask2
            });
        }
        public async Task ReadByDateAndUserAsync_Should_Return_Empty_List_If_There_Are_No_Suitable_Tasks()
        {
            var reportDateItemIdentifier = new ReportDateItemIdentifier
            {
                TeamId = Guid.NewGuid(),
                Date   = new DateTime(2019, 1, 14),
                UserId = Guid.NewGuid()
            };
            var reportTask1 = new ReportTask
            {
                Id                 = Guid.NewGuid(),
                CurrentState       = "some state",
                Problems           = "some problems",
                Url                = "some url",
                Theme              = "some theme",
                IsPublic           = true,
                DateItemIdentifier = reportDateItemIdentifier
            };
            var reportTask2 = new ReportTask
            {
                Id                 = Guid.NewGuid(),
                CurrentState       = "some state2",
                Problems           = "some problems2",
                Url                = "some url2",
                Theme              = "some theme2",
                IsPublic           = false,
                DateItemIdentifier = reportDateItemIdentifier
            };

            await repository.SaveAsync(reportTask1).ConfigureAwait(false);

            await repository.SaveAsync(reportTask2).ConfigureAwait(false);

            var readedTask = await repository.ReadByDateAndUserAsync(new ReportDateItemIdentifier
            {
                Date   = DateTime.Now,
                UserId = Guid.NewGuid(),
                TeamId = Guid.NewGuid()
            }, true).ConfigureAwait(false);

            readedTask.Should().BeEquivalentTo(EmptyCollection <ReportTask> .List);
        }
        public Task <List <ReportTask> > ReadByDateAndUserAsync(ReportDateItemIdentifier dateItemIdentifier,
                                                                bool isPublic)
        {
            if (dateItemIdentifier == null)
            {
                throw new ArgumentNullException(nameof(ReportTask.DateItemIdentifier));
            }

            return(queryExecuter.QueryAsync(async connection =>
            {
                var dayPeriod = GetFullDayPeriod(dateItemIdentifier.Date);
                var tasks = (await connection.QueryAsync <ReportTaskStored>(ReadByDateAndUserQuery, new
                {
                    TeamId = dateItemIdentifier.TeamId,
                    TaskDateStart = dayPeriod.Start,
                    TaskDateEnd = dayPeriod.End,
                    UserId = dateItemIdentifier.UserId,
                    IsPublic = isPublic
                }).ConfigureAwait(false))
                            .Select(ReportTaskStoredConverter.ToReportTask)
                            .ToList();
                return tasks;
            }));
        }
        public async Task ReadByDateAsync_Should_Return_Tasks_Of_All_Users_In_Team()
        {
            var teamId     = Guid.NewGuid();
            var userId     = Guid.NewGuid();
            var reportDate = new DateTime(2019, 1, 14);
            var reportDateItemIdentifier = new ReportDateItemIdentifier
            {
                TeamId = teamId,
                Date   = reportDate,
                UserId = userId
            };
            var reportTask1 = new ReportTask
            {
                Id                 = Guid.NewGuid(),
                CurrentState       = "some state",
                Problems           = "some problems",
                Url                = "some url",
                Theme              = "some theme",
                IsPublic           = true,
                DateItemIdentifier = reportDateItemIdentifier
            };
            var reportTask2 = new ReportTask
            {
                Id                 = Guid.NewGuid(),
                CurrentState       = "some state2",
                Problems           = "some problems2",
                Url                = "some url2",
                Theme              = "some theme2",
                IsPublic           = true,
                DateItemIdentifier = reportDateItemIdentifier
            };
            var reportTask3 = new ReportTask
            {
                Id                 = Guid.NewGuid(),
                CurrentState       = "some state3",
                Problems           = "some problems3",
                Url                = "some url3",
                Theme              = "some theme3",
                IsPublic           = true,
                DateItemIdentifier = new ReportDateItemIdentifier
                {
                    Date   = reportDateItemIdentifier.Date.AddDays(2),
                    TeamId = reportDateItemIdentifier.TeamId,
                    UserId = reportDateItemIdentifier.UserId
                }
            };
            var reportTask4 = new ReportTask
            {
                Id                 = Guid.NewGuid(),
                CurrentState       = "some state4",
                Problems           = "some problems4",
                Url                = "some url4",
                Theme              = "some theme4",
                IsPublic           = true,
                DateItemIdentifier = new ReportDateItemIdentifier
                {
                    Date   = reportDateItemIdentifier.Date,
                    TeamId = reportDateItemIdentifier.TeamId,
                    UserId = Guid.NewGuid()
                }
            };

            await repository.SaveAsync(reportTask1).ConfigureAwait(false);

            await repository.SaveAsync(reportTask3).ConfigureAwait(false);

            await repository.SaveAsync(reportTask2).ConfigureAwait(false);

            await repository.SaveAsync(reportTask4).ConfigureAwait(false);

            var readedTask = await repository.ReadByDateAsync(teamId, reportDate, true).ConfigureAwait(false);

            readedTask.Should().BeEquivalentTo(new List <ReportTask> {
                reportTask1, reportTask2, reportTask4
            });
        }