public async Task CreateProjectTagAsync_BadRequest_ShouldThrowProjectApiException()
        {
            // Arrange
            var existingProjectTag = new GetProjectTagPayload
            {
                Id   = Guid.NewGuid().ToString(),
                Name = Guid.NewGuid().ToString(),
            };

            var createProjectTagRequest = new CreateProjectTagRequest(existingProjectTag.Name);

            var expectedResponse = new HttpResponseMessage
            {
                StatusCode     = HttpStatusCode.BadRequest,
                RequestMessage = new HttpRequestMessage
                {
                    RequestUri = new Uri("http://www.mock-web-address.com"),
                },
            };

            var projectApi = this.fixture.GetProjectApi(expectedResponse);

            // Act
            Func <Task> act = async() => await projectApi.CreateProjectTagAsync(createProjectTagRequest);

            // Assert
            await act.Should().ThrowAsync <FactroApiException>();
        }
        public async Task AddTagToProjectAsync_ValidRequest_ShouldReturnVoid()
        {
            // Arrange
            var existingProject = new GetProjectPayload
            {
                Id = Guid.NewGuid().ToString(),
            };

            var existingProjectTag = new GetProjectTagPayload
            {
                Id   = Guid.NewGuid().ToString(),
                Name = Guid.NewGuid().ToString(),
            };

            var addProjectTagAssociationRequest = new AddProjectTagAssociationRequest(existingProjectTag.Name);

            var expectedResponse = new HttpResponseMessage();

            var projectApi = this.fixture.GetProjectApi(expectedResponse);

            // Act
            Func <Task> act = async() => await projectApi.AddTagToProjectAsync(existingProject.Id, addProjectTagAssociationRequest);

            // Assert
            await act.Should().NotThrowAsync();
        }
        public async Task DeleteProjectTagAsync_ValidRequest_ShouldDeleteProjectTag()
        {
            // Arrange
            var existingProjectTag = new GetProjectTagPayload
            {
                Id = Guid.NewGuid().ToString(),
            };

            var expectedResponseContent =
                new StringContent(JsonConvert.SerializeObject(existingProjectTag, this.fixture.JsonSerializerSettings));

            var expectedResponse = new HttpResponseMessage
            {
                Content = expectedResponseContent,
            };

            var projectApi = this.fixture.GetProjectApi(expectedResponse);

            var deleteProjectTagResponse = new DeleteProjectTagResponse();

            // Act
            Func <Task> act = async() => deleteProjectTagResponse = await projectApi.DeleteProjectTagAsync(existingProjectTag.Id);

            // Assert
            await act.Should().NotThrowAsync();

            deleteProjectTagResponse.Id.Should().Be(existingProjectTag.Id);
        }
        public async Task RemoveTagFromProjectAsync_InvalidProjectId_ShouldThrowArgumentNullException(string projectId)
        {
            // Arrange
            var existingTag = new GetProjectTagPayload
            {
                Id = Guid.NewGuid().ToString(),
            };

            var projectApi = this.fixture.GetProjectApi();

            // Act
            Func <Task> act = async() => await projectApi.RemoveTagFromProjectAsync(projectId, existingTag.Id);

            // Assert
            await act.Should().ThrowAsync <ArgumentNullException>();
        }
        public async Task AddTagToProjectAsync_InvalidProjectId_ShouldThrowArgumentNullException(string projectId)
        {
            // Arrange
            var existingProjectTag = new GetProjectTagPayload
            {
                Id   = Guid.NewGuid().ToString(),
                Name = Guid.NewGuid().ToString(),
            };

            var addProjectTagAssociationRequest = new AddProjectTagAssociationRequest(existingProjectTag.Name);

            var projectApi = this.fixture.GetProjectApi();

            // Act
            Func <Task> act = async() => await projectApi.AddTagToProjectAsync(projectId, addProjectTagAssociationRequest);

            // Assert
            await act.Should().ThrowAsync <ArgumentNullException>();
        }
        public async Task GetTagsOfProjectAsync_ValidRequest_ShouldReturnTagsOfProject()
        {
            // Arrange
            var existingProject = new GetProjectTagPayload
            {
                Id = Guid.NewGuid().ToString(),
            };

            var existingProjectTagsList = new List <GetAssignedProjectTagPayload>
            {
                new GetAssignedProjectTagPayload
                {
                    Id = Guid.NewGuid().ToString(),
                },
                new GetAssignedProjectTagPayload
                {
                    Id = Guid.NewGuid().ToString(),
                },
            };

            var expectedResponseContent = new StringContent(JsonConvert.SerializeObject(existingProjectTagsList, this.fixture.JsonSerializerSettings));

            var expectedResponse = new HttpResponseMessage
            {
                Content = expectedResponseContent,
            };

            var projectApi = this.fixture.GetProjectApi(expectedResponse);

            var getProjectTagsResponse = new List <GetAssignedProjectTagPayload>();

            // Act
            Func <Task> act = async() => getProjectTagsResponse = (await projectApi.GetTagsOfProjectAsync(existingProject.Id)).ToList();

            // Assert
            await act.Should().NotThrowAsync();

            getProjectTagsResponse.Should().HaveCount(existingProjectTagsList.Count);
        }
        public async Task RemoveTagFromProjectAsync_ValidRequest_ShouldReturnVoid()
        {
            // Arrange
            var existingProject = new GetProjectPayload
            {
                Id = Guid.NewGuid().ToString(),
            };

            var existingTag = new GetProjectTagPayload
            {
                Id = Guid.NewGuid().ToString(),
            };

            var expectedResponse = new HttpResponseMessage();

            var projectApi = this.fixture.GetProjectApi(expectedResponse);

            // Act
            Func <Task> act = async() => await projectApi.RemoveTagFromProjectAsync(existingProject.Id, existingTag.Id);

            // Assert
            await act.Should().NotThrowAsync();
        }