public async Task SpecificationRelationshipsPageModel_GivenDatasetRelationshipsResponseReturnsBadRequest_ReturnsStatusCode500()
        {
            // Arrange
            string specificationId = Guid.NewGuid().ToString();

            SpecificationSummary specification = new SpecificationSummary
            {
                Id = specificationId
            };

            ApiResponse <SpecificationSummary> specificationResponse = new ApiResponse <SpecificationSummary>(HttpStatusCode.OK, specification);

            ISpecsApiClient specsApiClient = CreateSpecsApiClient();

            specsApiClient
            .GetSpecificationSummary(Arg.Is(specificationId))
            .Returns(specificationResponse);

            ApiResponse <IEnumerable <DatasetSpecificationRelationshipModel> > relationshipsResponse = new ApiResponse <IEnumerable <DatasetSpecificationRelationshipModel> >(HttpStatusCode.BadRequest);

            IDatasetsApiClient datasetsApiClient = CreateDatasetApiClient();

            datasetsApiClient
            .GetDatasetSpecificationRelationshipsBySpecificationId(Arg.Is(specificationId))
            .Returns(relationshipsResponse);

            ILogger logger = CreateLogger();

            SpecificationRelationshipsPageModel pageModel = CreatePageModel(specsApiClient, datasetsApiClient, logger);

            // Act
            IActionResult result = await pageModel.OnGetAsync(specificationId);

            // Assert
            result
            .Should()
            .BeOfType <StatusCodeResult>();

            StatusCodeResult statusCodeResult = result as StatusCodeResult;

            statusCodeResult
            .StatusCode
            .Should()
            .Be(500);

            logger
            .Received(1)
            .Error($"Failed to fetch specification relationships for specification id: {specificationId}");

            logger
            .Received(1)
            .Error($"A null view model was returned");
        }
        public void SpecificationRelationshipsPageModel_GivenNullOrEmptySpecificationId_ThrowsArgumentNullException()
        {
            // Arrange
            SpecificationRelationshipsPageModel pageModel = CreatePageModel();

            string specificationId = string.Empty;

            // Act
            Func <Task> test = async() => await pageModel.OnGetAsync(specificationId);

            // Assert
            test
            .Should()
            .ThrowExactly <ArgumentNullException>();
        }
        public async Task SpecificationRelationshipsPageModel_GivenSpecResponseReturnsBadRequest_ReturnsStatusCode400()
        {
            // Arrange
            string specificationId = Guid.NewGuid().ToString();

            ApiResponse <SpecificationSummary> specificationResponse = new ApiResponse <SpecificationSummary>(HttpStatusCode.BadRequest);

            ISpecsApiClient specsApiClient = CreateSpecsApiClient();

            specsApiClient
            .GetSpecificationSummary(Arg.Is(specificationId))
            .Returns(specificationResponse);

            ILogger logger = CreateLogger();

            SpecificationRelationshipsPageModel pageModel = CreatePageModel(specsApiClient, logger: logger);

            // Act
            IActionResult result = await pageModel.OnGetAsync(specificationId);

            // Assert
            result
            .Should()
            .BeOfType <StatusCodeResult>();

            StatusCodeResult statusCodeResult = result as StatusCodeResult;

            statusCodeResult
            .StatusCode
            .Should()
            .Be(400);

            logger
            .Received(1)
            .Error("Failed to fetch specification with status code BadRequest");
        }
        public async Task SpecificationRelationshipsPageModel_GivenUserHasNoPermissionToMapDataSetsForSpecification_ThenReturnPageResultWithAuthorizedToEditFlagSetToFalse()
        {
            // Arrange
            string specificationId = Guid.NewGuid().ToString();

            SpecificationSummary specification = new SpecificationSummary
            {
                Id = specificationId
            };

            ApiResponse <SpecificationSummary> specificationResponse = new ApiResponse <SpecificationSummary>(HttpStatusCode.OK, specification);

            ISpecsApiClient specsApiClient = CreateSpecsApiClient();

            specsApiClient
            .GetSpecificationSummary(Arg.Is(specificationId))
            .Returns(specificationResponse);

            IEnumerable <DatasetSpecificationRelationshipModel> relationships = new[]
            {
                new DatasetSpecificationRelationshipModel
                {
                    DatasetId               = "any-ds-id",
                    DatasetName             = "any ds name",
                    RelationshipDescription = "any relationship description",
                    Definition              = new SpecificationDataDefinitionRelationshipModel
                    {
                        Id          = "def-id",
                        Name        = "def name",
                        Description = "def desc"
                    },
                    Version        = 1,
                    Id             = "rel-id",
                    Name           = "rel name",
                    IsProviderData = true
                }
            };

            ApiResponse <IEnumerable <DatasetSpecificationRelationshipModel> > relationshipsResponse = new ApiResponse <IEnumerable <DatasetSpecificationRelationshipModel> >(HttpStatusCode.OK, relationships);

            IDatasetsApiClient datasetsApiClient = CreateDatasetApiClient();

            datasetsApiClient
            .GetDatasetSpecificationRelationshipsBySpecificationId(Arg.Is(specificationId))
            .Returns(relationshipsResponse);

            ILogger logger = CreateLogger();

            SpecificationRelationshipsPageModel pageModel = CreatePageModel(specsApiClient, datasetsApiClient, logger,
                                                                            authorizationHelper: CreateMockAuthenticationHelper(false));


            // Act
            IActionResult result = await pageModel.OnGetAsync(specificationId);

            // Assert
            result
            .Should()
            .BeOfType <PageResult>();

            pageModel
            .IsAuthorizedToMap
            .Should()
            .BeFalse();
        }
        public async Task SpecificationRelationshipsPageModel_GivenDatasetRelationshipsResponseReturnsOKWithContent_ReturnsPage()
        {
            // Arrange
            string specificationId = Guid.NewGuid().ToString();

            SpecificationSummary specification = new SpecificationSummary
            {
                Id = specificationId
            };

            ApiResponse <SpecificationSummary> specificationResponse = new ApiResponse <SpecificationSummary>(HttpStatusCode.OK, specification);

            ISpecsApiClient specsApiClient = CreateSpecsApiClient();

            specsApiClient
            .GetSpecificationSummary(Arg.Is(specificationId))
            .Returns(specificationResponse);

            IEnumerable <DatasetSpecificationRelationshipModel> relationships = new[]
            {
                new DatasetSpecificationRelationshipModel
                {
                    DatasetId               = "any-ds-id",
                    DatasetName             = "any ds name",
                    RelationshipDescription = "any relationship description",
                    Definition              = new SpecificationDataDefinitionRelationshipModel
                    {
                        Id          = "def-id",
                        Name        = "def name",
                        Description = "def desc"
                    },
                    Version        = 1,
                    Id             = "rel-id",
                    Name           = "rel name",
                    IsProviderData = true
                }
            };

            ApiResponse <IEnumerable <DatasetSpecificationRelationshipModel> > relationshipsResponse = new ApiResponse <IEnumerable <DatasetSpecificationRelationshipModel> >(HttpStatusCode.OK, relationships);

            IDatasetsApiClient datasetsApiClient = CreateDatasetApiClient();

            datasetsApiClient
            .GetDatasetSpecificationRelationshipsBySpecificationId(Arg.Is(specificationId))
            .Returns(relationshipsResponse);

            ILogger logger = CreateLogger();

            SpecificationRelationshipsPageModel pageModel = CreatePageModel(specsApiClient, datasetsApiClient, logger);

            // Act
            IActionResult result = await pageModel.OnGetAsync(specificationId);

            // Assert
            result
            .Should()
            .BeOfType <PageResult>();

            pageModel
            .ShowSuccessMessage
            .Should()
            .BeFalse();

            pageModel
            .ViewModel
            .Items
            .Count()
            .Should()
            .Be(1);

            pageModel
            .ViewModel
            .Items
            .First()
            .DatasetId
            .Should()
            .Be("any-ds-id");

            pageModel
            .ViewModel
            .Items
            .First()
            .DatasetName
            .Should()
            .Be("any ds name");

            pageModel
            .ViewModel
            .Items
            .First()
            .RelationshipDescription
            .Should()
            .Be("any relationship description");

            pageModel
            .ViewModel
            .Items
            .First()
            .DatasetVersion
            .Should()
            .Be(1);

            pageModel
            .ViewModel
            .Items
            .First()
            .RelationshipId
            .Should()
            .Be("rel-id");

            pageModel
            .ViewModel
            .Items
            .First()
            .IsProviderData
            .Should().BeTrue();

            pageModel
            .IsAuthorizedToMap
            .Should().BeTrue();
        }