public async Task Should_Include_Closed_Milestone_If_Specified()
    {
        // Given
        var dbContextOptions = new DbContextOptionsBuilder <GitBucketDbContext>()
                               .UseInMemoryDatabase(databaseName: "Should_Include_Closed_Milestone_If_Specified")
                               .Options;

        var dbContext = new GitBucketDbContext(dbContextOptions);
        var options   = new MilestoneOptions {
            ExecutedDate = new DateTime(2018, 7, 1), IncludeClosed = true
        };

        dbContext.Milestones.Add(new Milestone
        {
            MilestoneId    = 1,
            Title          = "v0.1.0",
            RepositoryName = "test1",
            DueDate        = new DateTime(2018, 7, 1),
            ClosedDate     = new DateTime(2018, 7, 1),
            Description    = "Implement xxx feature",
            UserName       = "******",
            Issues         = new[]
            {
                new Issue
                {
                    IssueId          = 1,
                    AssignedUserName = "******",
                    UserName         = "******",
                    RepositoryName   = "test1",
                    OpenedUserName   = "******",
                    Title            = "Implement xxx feature",
                }
            }
        });

        dbContext.SaveChanges();

        var service = new MilestoneService(dbContext, FakeConsole);

        // When
        var result = await service.ShowMilestones(options);

        // Then
        Assert.Equal(0, result);
        Assert.Equal(3, FakeConsole.Messages.Count);
        Assert.Empty(FakeConsole.WarnMessages);
        Assert.Empty(FakeConsole.ErrorMessages);

        Assert.Equal("There are 1 milestone.", FakeConsole.Messages[0]);
        Assert.Equal(string.Empty, FakeConsole.Messages[1]);

        Assert.Equal("* [root/test1], [v0.1.0], [2018/07/01], [Implement xxx feature], [user1]", FakeConsole.Messages[2]);
    }
    public async void Milestone_Has_Issue_Without_Labels()
    {
        // Given
        var options = new ReleaseOptions {
            MileStone = "v1.0.0", Owner = "root", Repository = "test"
        };
        var dbContextOptions = new DbContextOptionsBuilder <GitBucketDbContext>()
                               .UseInMemoryDatabase(databaseName: "Milestone_Has_Issue_Without_Labels")
                               .Options;

        var dbContext = new GitBucketDbContext(dbContextOptions);

        dbContext.Issues.Add(new Core.Models.Issue
        {
            Milestone = new Core.Models.Milestone
            {
                RepositoryName = options.Repository,
                Title          = options.MileStone,
                UserName       = options.Owner,
            },
            RepositoryName = options.Repository,
            UserName       = options.Owner,
            OpenedUserName = "******",
            Title          = "Implement xxx feature",
        });

        dbContext.SaveChanges();

        var service = new ReleaseService(dbContext, FakeConsole);

        // When
        var result = await service.Execute(options, new Mock <IGitHubClient>().Object);

        // Then
        Assert.Equal(1, result);
        Assert.Single(FakeConsole.Messages);
        Assert.Equal("", FakeConsole.Messages[0]);

        Assert.Equal(3, FakeConsole.WarnMessages.Count);
        Assert.Equal("There are unclosed issues in \"v1.0.0\".", FakeConsole.WarnMessages[0]);
        Assert.Equal("Do you want to continue?([Y]es/[N]o): yes", FakeConsole.WarnMessages[1]);
        Assert.Equal("There are issues which have no labels in \"v1.0.0\".", FakeConsole.WarnMessages[2]);

        Assert.Empty(FakeConsole.ErrorMessages);
    }
    public async void Milestone_Has_No_PullRequest()
    {
        // Given
        var dbContextOptions = new DbContextOptionsBuilder <GitBucketDbContext>()
                               .UseInMemoryDatabase(databaseName: "Milestone_Has_No_PullRequest")
                               .Options;

        var dbContext = new GitBucketDbContext(dbContextOptions);
        var options   = new ReleaseOptions {
            FromPullRequest = true, MileStone = "v1.0.0", Owner = "root", Repository = "test"
        };
        var service = new ReleaseService(dbContext, FakeConsole);

        // When
        var result = await service.Execute(options, new Mock <IGitHubClient>().Object);

        // Then
        Assert.Equal(1, result);
        Assert.Empty(FakeConsole.Messages);
        Assert.Single(FakeConsole.WarnMessages);
        Assert.Empty(FakeConsole.ErrorMessages);
        Assert.Equal("There are no pull requests related to \"v1.0.0\".", FakeConsole.WarnMessages[0]);
    }
    public async Task Should_Return_If_No_Milestone()
    {
        // Given
        var dbContextOptions = new DbContextOptionsBuilder <GitBucketDbContext>()
                               .UseInMemoryDatabase(databaseName: "Should_Return_If_No_Milestone")
                               .Options;

        var dbContext = new GitBucketDbContext(dbContextOptions);
        var options   = new MilestoneOptions {
            ExecutedDate = new DateTime(2018, 7, 29)
        };
        var service = new MilestoneService(dbContext, FakeConsole);

        // When
        var result = await service.ShowMilestones(options);

        // Then
        Assert.Equal(0, result);
        Assert.Single(FakeConsole.Messages);
        Assert.Empty(FakeConsole.WarnMessages);
        Assert.Empty(FakeConsole.ErrorMessages);

        Assert.Equal("There are no milestone.", FakeConsole.Messages[0]);
    }
    private static GitBucketDbContext EnsureDbCreated(ReleaseOptions options)
    {
        var dbContextOptions = new DbContextOptionsBuilder <GitBucketDbContext>()
                               .UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
                               .Options;

        var dbContext = new GitBucketDbContext(dbContextOptions);

        var milestone = new Core.Models.Milestone
        {
            RepositoryName = options.Repository,
            Title          = options.MileStone,
            UserName       = options.Owner,
        };

        var highPriority = new Core.Models.Priority
        {
            Ordering       = 0,
            PriorityName   = "high",
            RepositoryName = options.Repository,
            UserName       = options.Owner,
            Color          = "red",
        };

        var defaultPriority = new Core.Models.Priority
        {
            Ordering       = 1,
            PriorityName   = "default",
            RepositoryName = options.Repository,
            UserName       = options.Owner,
            Color          = "red",
        };

        dbContext.Issues.AddRange(new List <Core.Models.Issue>
        {
            new Core.Models.Issue
            {
                Closed         = true,
                IssueId        = 1,
                Milestone      = milestone,
                Priority       = highPriority,
                RepositoryName = options.Repository,
                Title          = "Found a bug!",
                UserName       = options.Owner,
                OpenedUserName = "******",
            },
            new Core.Models.Issue
            {
                Closed         = true,
                IssueId        = 2,
                Milestone      = milestone,
                Priority       = defaultPriority,
                RepositoryName = options.Repository,
                Title          = "Another bug",
                UserName       = options.Owner,
                OpenedUserName = "******",
            },
            new Core.Models.Issue
            {
                Closed         = true,
                IssueId        = 3,
                Milestone      = milestone,
                Priority       = defaultPriority,
                RepositoryName = options.Repository,
                Title          = "Some improvement on build",
                UserName       = options.Owner,
                OpenedUserName = "******",
            },
            new Core.Models.Issue
            {
                Closed         = true,
                IssueId        = 4,
                Milestone      = milestone,
                Priority       = defaultPriority,
                PullRequest    = true,
                RepositoryName = options.Repository,
                Title          = "Fix a bug",
                UserName       = options.Owner,
                OpenedUserName = "******",
            }
        });

        dbContext.IssueLabels.AddRange(new List <Core.Models.IssueLabel>
        {
            new Core.Models.IssueLabel
            {
                IssueId        = 1,
                LabelId        = 10,
                RepositoryName = options.Repository,
                UserName       = options.Owner,
            },
            new Core.Models.IssueLabel
            {
                IssueId        = 2,
                LabelId        = 10,
                RepositoryName = options.Repository,
                UserName       = options.Owner,
            },
            new Core.Models.IssueLabel
            {
                IssueId        = 3,
                LabelId        = 30,
                RepositoryName = options.Repository,
                UserName       = options.Owner,
            },
            new Core.Models.IssueLabel
            {
                IssueId        = 4,
                LabelId        = 10,
                RepositoryName = options.Repository,
                UserName       = options.Owner,
            }
        });

        dbContext.Labels.AddRange(new List <Core.Models.Label>
        {
            new Core.Models.Label
            {
                LabelId        = 10,
                LabelName      = "Bug",
                RepositoryName = options.Repository,
                UserName       = options.Owner,
                Color          = "red",
            },
            new Core.Models.Label
            {
                LabelId        = 30,
                LabelName      = "Enhancement",
                RepositoryName = options.Repository,
                UserName       = options.Owner,
                Color          = "red",
            }
        });

        dbContext.SaveChanges();
        return(dbContext);
    }
    public async Task Should_Show_Multiple_Milestones()
    {
        // Given
        var dbContextOptions = new DbContextOptionsBuilder <GitBucketDbContext>()
                               .UseInMemoryDatabase(databaseName: "Should_Show_Multiple_Milestones")
                               .Options;

        var dbContext = new GitBucketDbContext(dbContextOptions);
        var options   = new MilestoneOptions {
            ExecutedDate = new DateTime(2018, 7, 1), IncludeClosed = true
        };

        dbContext.Milestones.AddRange(new List <Core.Models.Milestone>
        {
            new Milestone
            {
                MilestoneId    = 1,
                Title          = "v0.1.0",
                RepositoryName = "test1",
                DueDate        = new DateTime(2018, 6, 30),
                ClosedDate     = null,
                Description    = "Error",
                UserName       = "******",
                Issues         = new[]
                {
                    new Issue
                    {
                        IssueId          = 1,
                        AssignedUserName = "******",
                        UserName         = "******",
                        RepositoryName   = "test1",
                        OpenedUserName   = "******",
                        Title            = "Implement xxx feature",
                    }
                }
            },
            new Milestone
            {
                MilestoneId    = 2,
                Title          = "v0.2.0",
                RepositoryName = "test1",
                DueDate        = new DateTime(2018, 7, 1),
                ClosedDate     = new DateTime(2018, 7, 1),
                Description    = "Closed",
                UserName       = "******",
                Issues         = new[]
                {
                    new Issue
                    {
                        IssueId          = 2,
                        AssignedUserName = "******",
                        UserName         = "******",
                        RepositoryName   = "test1",
                        OpenedUserName   = "******",
                        Title            = "Implement xxx feature",
                    }
                }
            },
            new Milestone
            {
                MilestoneId    = 3,
                Title          = "v0.3.0",
                RepositoryName = "test1",
                DueDate        = new DateTime(2018, 7, 7),
                ClosedDate     = null,
                Description    = "Warn",
                UserName       = "******",
                Issues         = new[]
                {
                    new Issue
                    {
                        IssueId          = 3,
                        AssignedUserName = "******",
                        UserName         = "******",
                        RepositoryName   = "test1",
                        OpenedUserName   = "******",
                        Title            = "Implement xxx feature",
                    }
                }
            },
            new Milestone
            {
                MilestoneId    = 4,
                Title          = "v0.4.0",
                RepositoryName = "test1",
                DueDate        = new DateTime(2018, 7, 8),
                ClosedDate     = null,
                Description    = "Info",
                UserName       = "******",
                Issues         = new[]
                {
                    new Issue
                    {
                        IssueId          = 4,
                        AssignedUserName = "******",
                        UserName         = "******",
                        RepositoryName   = "test1",
                        OpenedUserName   = "******",
                        Title            = "Implement xxx feature",
                    }
                }
            }
        });

        dbContext.SaveChanges();

        var service = new MilestoneService(dbContext, FakeConsole);

        // When
        var result = await service.ShowMilestones(options);

        // Then
        Assert.Equal(0, result);
        Assert.Equal(4, FakeConsole.Messages.Count);
        Assert.Single(FakeConsole.WarnMessages);
        Assert.Single(FakeConsole.ErrorMessages);

        Assert.Equal("There are 4 milestones.", FakeConsole.Messages[0]);
        Assert.Equal(string.Empty, FakeConsole.Messages[1]);

        Assert.Equal("* [root/test1], [v0.1.0], [2018/06/30], [Error], [user1]", FakeConsole.ErrorMessages[0]);
        Assert.Equal("* [root/test1], [v0.2.0], [2018/07/01], [Closed], [user1]", FakeConsole.Messages[2]);
        Assert.Equal("* [root/test1], [v0.3.0], [2018/07/07], [Warn], [user1]", FakeConsole.WarnMessages[0]);
        Assert.Equal("* [root/test1], [v0.4.0], [2018/07/08], [Info], [user1]", FakeConsole.Messages[3]);
    }