public async Task OnGetAsync_GivenRelationshipIdButGettingSourceModelReturnedInternalServerError_Returns404()
        {
            // Arrange
            SelectDataSourceModel model = new SelectDataSourceModel {
                SpecificationId = "abc123"
            };
            ApiResponse <SelectDataSourceModel> sourcesResponse = new ApiResponse <SelectDataSourceModel>(HttpStatusCode.InternalServerError, model);

            IDatasetsApiClient datasetsApiClient = CreateDatasetsApiClient();

            datasetsApiClient
            .GetDatasourcesByRelationshipId(Arg.Is(relationshipId))
            .Returns(sourcesResponse);

            ILogger logger = CreateLogger();

            SelectSourceDatasetPageModel pageModel = CreatePageModel(datasetsApiClient, logger);

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

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

            logger
            .Received(1)
            .Error(Arg.Is($"Failed to fetch data sources with status code InternalServerError"));
        }
        public async Task OnGetAsync_GivenRelationshipIdAndGettingSourceModelReturnsOkButNullContent_Returns404()
        {
            // Arrange
            ApiResponse <SelectDataSourceModel> sourcesResponse = new ApiResponse <SelectDataSourceModel>(HttpStatusCode.OK);

            IDatasetsApiClient datasetsApiClient = CreateDatasetsApiClient();

            datasetsApiClient
            .GetDatasourcesByRelationshipId(Arg.Is(relationshipId))
            .Returns(sourcesResponse);

            ILogger logger = CreateLogger();

            SelectSourceDatasetPageModel pageModel = CreatePageModel(datasetsApiClient, logger);

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

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

            logger
            .Received(1)
            .Error(Arg.Is($"Failed to fetch data sources with status code OK"));
        }
        public async Task OnPostAsync_GivenUserDoesNotHaveMapDatasetsPermission_Returns403()
        {
            // Arrange
            SelectDataSourceModel sourceModel = new SelectDataSourceModel();

            ApiResponse <SelectDataSourceModel> sourcesResponse = new ApiResponse <SelectDataSourceModel>(HttpStatusCode.OK, sourceModel);

            IDatasetsApiClient datasetsApiClient = CreateDatasetsApiClient();

            datasetsApiClient
            .GetDatasourcesByRelationshipId(Arg.Is(relationshipId))
            .Returns(sourcesResponse);

            ILogger logger = CreateLogger();

            IAuthorizationHelper authorizationHelper = Substitute.For <IAuthorizationHelper>();

            authorizationHelper
            .DoesUserHavePermission(Arg.Any <ClaimsPrincipal>(), Arg.Any <ISpecificationAuthorizationEntity>(), Arg.Is(SpecificationActionTypes.CanMapDatasets))
            .Returns(false);

            SelectSourceDatasetPageModel pageModel = CreatePageModel(datasetsApiClient, logger, authorizationHelper);

            // Act
            IActionResult result = await pageModel.OnPostAsync(relationshipId, specificationId);

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

            pageModel
            .IsAuthorizedToMap
            .Should().BeFalse();
        }
        public async Task OnPostAsync_GivenDataetVersionIUsNullAndRelationshipIdAndGetsModelWithoutDatasets_Returns200()
        {
            // Arrange
            SelectDataSourceModel sourceModel = new SelectDataSourceModel();

            ApiResponse <SelectDataSourceModel> sourcesResponse = new ApiResponse <SelectDataSourceModel>(HttpStatusCode.OK, sourceModel);

            IDatasetsApiClient datasetsApiClient = CreateDatasetsApiClient();

            datasetsApiClient
            .GetDatasourcesByRelationshipId(Arg.Is(relationshipId))
            .Returns(sourcesResponse);

            ILogger logger = CreateLogger();

            SelectSourceDatasetPageModel pageModel = CreatePageModel(datasetsApiClient, logger);

            // Act
            IActionResult result = await pageModel.OnPostAsync(relationshipId, specificationId, null);

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

            pageModel
            .IsAuthorizedToMap
            .Should().BeTrue();
        }
        private static SelectSourceDatasetPageModel CreatePageModel(IDatasetsApiClient datasetClient = null, ILogger logger = null, IAuthorizationHelper authorizationHelper = null)
        {
            SelectSourceDatasetPageModel pageModel = new SelectSourceDatasetPageModel(datasetClient ?? CreateDatasetsApiClient(), logger ?? CreateLogger(), authorizationHelper ?? TestAuthHelper.CreateAuthorizationHelperSubstitute(SpecificationActionTypes.CanMapDatasets));

            pageModel.PageContext = TestAuthHelper.CreatePageContext();

            return(pageModel);
        }
        public void OnGetAsync_GivenNullOrEmptyRelationshipId_ThrowsArgumentNullException()
        {
            // Arrange
            SelectSourceDatasetPageModel pageModel = CreatePageModel();

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

            // Assert
            test
            .Should()
            .ThrowExactly <ArgumentNullException>();
        }
        public async Task OnGetAsync_GivenRelationshipIdAndGetsModelWithDatasets_Returns200()
        {
            // Arrange
            SelectDataSourceModel sourceModel = new SelectDataSourceModel();

            sourceModel.Datasets = new[]
            {
                new DatasetVersionsModel
                {
                    Id       = "ds-id",
                    Name     = "ds name",
                    Versions = new[] { 1 }
                }
            };

            ApiResponse <SelectDataSourceModel> sourcesResponse = new ApiResponse <SelectDataSourceModel>(HttpStatusCode.OK, sourceModel);

            IDatasetsApiClient datasetsApiClient = CreateDatasetsApiClient();

            datasetsApiClient
            .GetDatasourcesByRelationshipId(Arg.Is(relationshipId))
            .Returns(sourcesResponse);

            ILogger logger = CreateLogger();

            SelectSourceDatasetPageModel pageModel = CreatePageModel(datasetsApiClient, logger);

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

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

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

            pageModel
            .IsAuthorizedToMap
            .Should().BeTrue();
        }
        public async Task OnPostAsync_GivenValidDatsetVersionButSavingIsUnsuccessful_Returns500()
        {
            // Arrange
            SelectDataSourceModel model = new SelectDataSourceModel {
                SpecificationId = "abc123"
            };
            ApiResponse <SelectDataSourceModel> sourcesResponse = new ApiResponse <SelectDataSourceModel>(HttpStatusCode.OK, model);

            IDatasetsApiClient datasetsApiClient = CreateDatasetsApiClient();

            datasetsApiClient
            .GetDatasourcesByRelationshipId(Arg.Is(relationshipId))
            .Returns(sourcesResponse);

            datasetsApiClient
            .AssignDataSourceVersionToRelationship(Arg.Any <AssignDatasetVersion>())
            .Returns(HttpStatusCode.InternalServerError);

            ILogger logger = CreateLogger();

            SelectSourceDatasetPageModel pageModel = CreatePageModel(datasetsApiClient, logger);

            // Act
            IActionResult result = await pageModel.OnPostAsync(relationshipId, specificationId, $"{datasetId}_2");

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

            StatusCodeResult statusCodeResult = result as StatusCodeResult;

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

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

            logger
            .Received(1)
            .Error(Arg.Is($"Failed to assign dataset version with status code: InternalServerError"));
        }
        public async Task OnPostAsync_GivenValidDatsetVersionAndSavingIsUnsuccessful_ReturnsRedirect()
        {
            // Arrange
            SelectDataSourceModel model = new SelectDataSourceModel {
                SpecificationId = "abc123"
            };
            ApiResponse <SelectDataSourceModel> sourcesResponse = new ApiResponse <SelectDataSourceModel>(HttpStatusCode.OK, model);

            IDatasetsApiClient datasetsApiClient = CreateDatasetsApiClient();

            datasetsApiClient
            .GetDatasourcesByRelationshipId(Arg.Is(relationshipId))
            .Returns(sourcesResponse);

            datasetsApiClient
            .AssignDataSourceVersionToRelationship(Arg.Any <AssignDatasetVersion>())
            .Returns(HttpStatusCode.NoContent);

            ILogger logger = CreateLogger();

            SelectSourceDatasetPageModel pageModel = CreatePageModel(datasetsApiClient, logger);

            // Act
            IActionResult result = await pageModel.OnPostAsync(relationshipId, specificationId, $"{datasetId}_2");

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

            RedirectResult redirectResult = result as RedirectResult;

            redirectResult
            .Url
            .Should()
            .Be($"/datasets/specificationrelationships?specificationId={specificationId}&wasSuccess=true");

            pageModel
            .IsAuthorizedToMap
            .Should().BeTrue();
        }
        public async Task OnPostAsync_GivenDatasetVersionIsInvalid_Returns500()
        {
            // Arrange
            SelectDataSourceModel model = new SelectDataSourceModel {
                SpecificationId = "abc123"
            };
            ApiResponse <SelectDataSourceModel> sourcesResponse = new ApiResponse <SelectDataSourceModel>(HttpStatusCode.OK, model);

            IDatasetsApiClient datasetsApiClient = CreateDatasetsApiClient();

            datasetsApiClient
            .GetDatasourcesByRelationshipId(Arg.Is(relationshipId))
            .Returns(sourcesResponse);

            ILogger logger = CreateLogger();

            SelectSourceDatasetPageModel pageModel = CreatePageModel(datasetsApiClient, logger);

            // Act
            IActionResult result = await pageModel.OnPostAsync(relationshipId, specificationId, datasetId);

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

            StatusCodeResult statusCodeResult = result as StatusCodeResult;

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

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

            logger
            .Received(1)
            .Error(Arg.Is($"Dataset version: {datasetId} is invalid"));
        }
        public async Task OnGetAsync_GivenUserDoesNotHaveMapDatasetsPermission_ThenReturnPageResultWithAuthorizedToEditFlagSetToFalse()
        {
            // Arrange
            SelectDataSourceModel sourceModel = new SelectDataSourceModel();

            sourceModel.Datasets = new[]
            {
                new DatasetVersionsModel
                {
                    Id       = "ds-id",
                    Name     = "ds name",
                    Versions = new[] { 1 }
                }
            };

            ApiResponse <SelectDataSourceModel> sourcesResponse = new ApiResponse <SelectDataSourceModel>(HttpStatusCode.OK, sourceModel);

            IDatasetsApiClient datasetsApiClient = CreateDatasetsApiClient();

            datasetsApiClient
            .GetDatasourcesByRelationshipId(Arg.Is(relationshipId))
            .Returns(sourcesResponse);

            ILogger logger = CreateLogger();

            IAuthorizationHelper         mockAuthorizationHelper = TestAuthHelper.CreateAuthorizationHelperSubstitute(SpecificationActionTypes.CanMapDatasets, false);
            SelectSourceDatasetPageModel pageModel = CreatePageModel(datasetsApiClient, logger, authorizationHelper: mockAuthorizationHelper);

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

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

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