public void SpecificationsRepositoryCtor_WhenApiClientIsNull_ShouldThrowException()
        {
            // Arrange
            ISpecificationsApiClientProxy nullApiClient = null;

            // Act
            Action specificationRepositoryCtor = () => { new SpecificationsRepository(nullApiClient); };

            // Assert
            specificationRepositoryCtor.Should().ThrowExactly <ArgumentNullException>();
        }
        public void GetSpecificationSummaryById_WhenGivenANullSpecificationId_ShouldThrowAnException()
        {
            // Arrange
            ISpecificationsApiClientProxy mockApiClient = Substitute.For <ISpecificationsApiClientProxy>();

            // Act
            SpecificationsRepository specificationRepo = new SpecificationsRepository(mockApiClient);
            Action getSpecificationBySummaryIdCall     = () => { specificationRepo.GetSpecificationSummaryById(null); };

            // Assert
            getSpecificationBySummaryIdCall.Should().ThrowExactly <ArgumentNullException>();
        }
        public void GetSpecificationSummaryById_WhenGivenAValidSpecificationId_ShouldCallApiClient()
        {
            // Arrange
            ISpecificationsApiClientProxy mockApiClient = Substitute.For <ISpecificationsApiClientProxy>();
            const string specificationId = "validSpecId";

            // Act
            SpecificationsRepository specificationRepo = new SpecificationsRepository(mockApiClient);

            specificationRepo.GetSpecificationSummaryById(specificationId).Wait();

            // Assert
            mockApiClient.Received(1).GetAsync <SpecificationSummary>(Arg.Any <string>());
        }
        async public Task GetSpecificationById_GivenSpecificationId_CallsWithCorrectUrl()
        {
            //Arrange
            const string specificationId = "spec-id";

            ISpecificationsApiClientProxy clientProxy = CreateApiClientProxy();

            SpecificationsRepository specificationsRepository = CreateSpecificationsRepository(clientProxy);

            //Act
            await specificationsRepository.GetSpecificationSummaryById(specificationId);

            //Assert
            await
            clientProxy
            .Received(1)
            .GetAsync <SpecificationSummary>(Arg.Is($"specs/specification-summary-by-id?specificationId={specificationId}"));
        }
        public SpecificationRepository(ISpecificationsApiClientProxy apiClient)
        {
            Guard.ArgumentNotNull(apiClient, nameof(apiClient));

            _apiClient = apiClient;
        }
 static SpecificationsRepository CreateSpecificationsRepository(ISpecificationsApiClientProxy apiClientProxy = null)
 {
     return(new SpecificationsRepository(apiClientProxy ?? CreateApiClientProxy()));
 }