public void Given_a_valid_Instant_When_WithCreated_is_called_Then_Created_Should_be_set()
        {
            // Arrange.
            IClock          clock   = ConstantClockStub.Create(0);
            BlogPostBuilder builder = BlogPostBuilder.Create(clock);
            Instant         created = Instant.FromUnixTimeMilliseconds(100000);

            // Act.
            builder = builder.WithCreated(created);

            // Assert.
            builder.Created.Should().Be(created);
        }
        public void Given_null_IClock_When_Create_is_called_Then_an_ArgumentNullException_should_be_thrown()
        {
            // Arrange.
            IClock clock = null;

            // Act.
            Action createBuilder = () => BlogPostBuilder.Create(clock);

            // Assert.
            createBuilder.Should()
            .Throw <ArgumentNullException>()
            .WithMessage("*cannot be null*clock*");
        }
        public void Given_a_valid_guid_When_WithId_is_called_Then_Id_should_be_set()
        {
            // Arrange.
            IClock          clock   = ConstantClockStub.Create(0);
            BlogPostBuilder builder = BlogPostBuilder.Create(clock);
            Guid            id      = Guid.NewGuid();

            // Act.
            builder = builder.WithId(id);

            // Assert.
            builder.Id.Should().Be(id);
        }
        public void Given_tags_is_not_null_When_WithTags_is_called_Then_Tags_should_be_set()
        {
            // Arrange.
            IClock              clock   = ConstantClockStub.Create(0);
            BlogPostBuilder     builder = BlogPostBuilder.Create(clock);
            IImmutableSet <Tag> tags    = ImmutableHashSet.Create(Tag.Create("name"));

            // Act.
            builder = builder.WithTags(tags);

            // Assert.
            builder.Tags.Should().BeEquivalentTo(tags);
        }
        public void Given_content_is_not_null_When_WithContent_is_called_Then_Content_should_be_set()
        {
            // Arrange.
            IClock          clock   = ConstantClockStub.Create(0);
            BlogPostBuilder builder = BlogPostBuilder.Create(clock);
            string          content = "Content";

            // Act.
            builder = builder.WithContent(content);

            // Assert.
            builder.Content.Should().Be(content);
        }
        public void Given_status_is_not_null_When_WithStatus_is_called_Then_Status_should_be_set()
        {
            // Arrange.
            IClock          clock   = ConstantClockStub.Create(0);
            BlogPostBuilder builder = BlogPostBuilder.Create(clock);
            BlogPostStatus  status  = BlogPostStatus.Published;

            // Act.
            builder = builder.WithStatus(status);

            // Assert.
            builder.Status.Should().Be(status);
        }
        public void Given_stauts_is_null_When_WithStatus_is_called_Then_an_ArgumentNullException_should_be_thrown()
        {
            // Arrange.
            IClock          clock   = ConstantClockStub.Create(0);
            BlogPostBuilder builder = BlogPostBuilder.Create(clock);
            BlogPostStatus  status  = null;

            // Act.
            Action testCode = () => builder.WithStatus(status);

            // Assert.
            testCode.Should()
            .Throw <ArgumentNullException>()
            .WithMessage("*cannot be null*status*");
        }
        public void Given_two_sets_of_tags_When_WithTags_is_called_Then_Tags_should_be_last_set_of_tags()
        {
            // Arrange.
            IClock              clock     = ConstantClockStub.Create(0);
            BlogPostBuilder     builder   = BlogPostBuilder.Create(clock);
            IImmutableSet <Tag> tags      = ImmutableHashSet.Create(Tag.Create("name"), Tag.Create("pizza"));
            IImmutableSet <Tag> otherTags = ImmutableHashSet.Create(Tag.Create("name"), Tag.Create("age"));

            // Act.
            builder = builder.WithTags(tags)
                      .WithTags(otherTags);

            // Assert.
            builder.Tags.Should().BeEquivalentTo(otherTags);
        }
        public void Given_tags_is_null_When_WithTags_is_called_Then_an_ArgumentNullException_should_be_thrown()
        {
            // Arrange.
            IClock              clock   = ConstantClockStub.Create(0);
            BlogPostBuilder     builder = BlogPostBuilder.Create(clock);
            IImmutableSet <Tag> tags    = null;

            // Act.
            Action testCode = () => builder.WithTags(tags);

            // Assert.
            testCode.Should()
            .Throw <ArgumentNullException>()
            .WithMessage("*cannot be null*tags*");
        }
        public void Given_a_valid_IClock_When_Create_is_called_Then_builder_should_have_defaults_set()
        {
            // Arrange.
            BlogPostBuilder builder;
            IClock          clock = ConstantClockStub.Create(0);

            // Act.
            builder = BlogPostBuilder.Create(clock);

            // Assert.
            builder.Id.Should().Be(Guid.Empty);
            builder.Content.Should().Be(string.Empty);
            builder.Created.Should().Be(clock.GetCurrentInstant());
            builder.Status.Should().BeEquivalentTo(BlogPostStatus.Draft);
            builder.Tags.Should().BeEmpty();
        }
        public void Given_a_valid_BlogPostBuilder_When_Build_is_called_Then_a_matching_BlogPost_is_constructed()
        {
            // Arrange.
            IClock          clock = ConstantClockStub.Create(0);
            BlogPostBuilder builder;
            BlogPost        blogPost;

            Guid                   id      = Guid.NewGuid();
            const string           content = "Content";
            BlogPostStatus         draft   = BlogPostStatus.Draft;
            ImmutableHashSet <Tag> tags    = ImmutableHashSet.Create(Tag.Create("tag"));

            builder = BlogPostBuilder.Create(clock)
                      .WithId(id)
                      .WithContent(content)
                      .WithStatus(draft)
                      .WithTags(tags);

            // Act.
            blogPost = builder.Build();

            // Assert.
            blogPost.Should().BeEquivalentTo(builder);
        }