public void MustBePending_Draft_Succeeds(SolutionStatus status)
        {
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var soln      = Creator.GetSolution(status: status);

            validator.MustBePending();
            var valres = validator.Validate(soln);

            valres.Errors.Should().BeEmpty();
        }
        public void PreviousVersionMustBeFromSameOrganisation_NoPrevious_Succeeds()
        {
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var soln      = Creator.GetSolution();

            validator.PreviousVersionMustBeFromSameOrganisation();
            var valres = validator.Validate(soln);

            valres.Errors.Should().BeEmpty();
        }
        public void MustBeFromSameOrganisationOrAdmin_Same_Succeeds()
        {
            var orgId = Guid.NewGuid().ToString();

            _context.Setup(x => x.HttpContext).Returns(Creator.GetContext(orgId: orgId, role: Roles.Supplier));
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var soln      = Creator.GetSolution(orgId: orgId);

            validator.MustBeFromSameOrganisationOrAdmin();
            var valres = validator.Validate(soln);

            valres.Errors.Should().BeEmpty();
        }
        public void MustBePending_NonDraft_ReturnsError(SolutionStatus status)
        {
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var soln      = Creator.GetSolution(status: status);

            validator.MustBePending();
            var valres = validator.Validate(soln);

            valres.Errors.Should()
            .ContainSingle(x => x.ErrorMessage == "Status must be Draft")
            .And
            .HaveCount(1);
        }
        public void MustBeDevelopment_Development_Succeeds(
            [ValueSource(nameof(DevelopmentEnvironments))] string environment)
        {
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var soln      = Creator.GetSolution();

            _env.Setup(x => x.EnvironmentName).Returns(environment);

            validator.MustBeDevelopment();
            var valres = validator.Validate(soln);

            valres.Errors.Should().BeEmpty();
        }
        public void MustBeValidOrganisationId_NotGuid_ReturnsError()
        {
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var soln      = Creator.GetSolution(orgId: "some other Id");

            validator.MustBeValidOrganisationId();
            var valres = validator.Validate(soln);

            valres.Errors.Should()
            .ContainSingle(x => x.ErrorMessage == "Invalid OrganisationId")
            .And
            .HaveCount(1);
        }
        public void PreviousVersionMustBeFromSameOrganisation_Different_ReturnsError()
        {
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var soln      = Creator.GetSolution(previousId: Guid.NewGuid().ToString());

            _solutionDatastore.Setup(x => x.ById(soln.PreviousId)).Returns(Creator.GetSolution());

            validator.PreviousVersionMustBeFromSameOrganisation();
            var valres = validator.Validate(soln);

            valres.Errors.Should()
            .ContainSingle(x => x.ErrorMessage == "Previous version must be from same organisation")
            .And
            .HaveCount(1);
        }
        public void MustBeDevelopment_NonDevelopment_ReturnsError(
            [ValueSource(nameof(NonDevelopmentEnvironments))] string environment)
        {
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var soln      = Creator.GetSolution();

            _env.Setup(x => x.EnvironmentName).Returns(environment);

            validator.MustBeDevelopment();
            var valres = validator.Validate(soln);

            valres.Errors.Should()
            .ContainSingle(x => x.ErrorMessage == "Only available in Development environment")
            .And
            .HaveCount(1);
        }
        public void MustBeSameOrganisation_Different_ReturnsError()
        {
            var orgId     = Guid.NewGuid().ToString();
            var soln      = Creator.GetSolution(orgId: orgId);
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);

            _solutionDatastore.Setup(x => x.ById(soln.Id)).Returns(Creator.GetSolution());

            validator.MustBeSameOrganisation();
            var valres = validator.Validate(soln);

            valres.Errors.Should()
            .ContainSingle(x => x.ErrorMessage == "Cannot transfer solutions between organisations")
            .And
            .HaveCount(1);
        }
        public void MustBePendingToChangeVersion_SameVersion_Succeeds(SolutionStatus status)
        {
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var soln      = Creator.GetSolution(status: status);

            soln.Version = "Original version";
            var solnOld = Creator.GetSolution(status: status, id: soln.Id);

            solnOld.Version = "Original version";
            _solutionDatastore.Setup(x => x.ById(soln.Id)).Returns(solnOld);

            validator.MustBePendingToChangeVersion();
            var valres = validator.Validate(soln);

            valres.Errors.Should().BeEmpty();
        }
        public void MustBeValidStatusTransition_Valid_Succeeds(SolutionStatus oldStatus, SolutionStatus newStatus, string role)
        {
            var solnId = Guid.NewGuid().ToString();

            _context.Setup(x => x.HttpContext).Returns(Creator.GetContext(role: role));
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var oldSoln   = Creator.GetSolution(id: solnId, status: oldStatus);
            var newSoln   = Creator.GetSolution(id: solnId, status: newStatus);

            _solutionDatastore.Setup(x => x.ById(solnId)).Returns(oldSoln);

            validator.MustBeValidStatusTransition();
            var valres = validator.Validate(newSoln);

            valres.Errors.Should().BeEmpty();
        }
        public void MustBeCurrentVersion_Current_Succeeds()
        {
            var solnId = Guid.NewGuid().ToString();

            _context.Setup(x => x.HttpContext).Returns(Creator.GetContext());
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var oldSoln   = Creator.GetSolution(id: solnId);
            var newSoln   = Creator.GetSolution(id: solnId);

            _solutionDatastore.Setup(x => x.ByOrganisation(newSoln.OrganisationId)).Returns(new[] { oldSoln });

            validator.MustBeCurrentVersion();
            var valres = validator.Validate(newSoln);

            valres.Errors.Should().BeEmpty();
        }
        public void MustBeCurrentVersion_PreviousVersion_ReturnsError()
        {
            _context.Setup(x => x.HttpContext).Returns(Creator.GetContext());
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var soln      = Creator.GetSolution();

            _solutionDatastore.Setup(x => x.ByOrganisation(soln.OrganisationId)).Returns(new[] { Creator.GetSolution(previousId: soln.Id) });

            validator.MustBeCurrentVersion();
            var valres = validator.Validate(soln);

            valres.Errors.Should()
            .ContainSingle(x => x.ErrorMessage == "Can only change current version")
            .And
            .HaveCount(1);
        }
        public void MustBeValidOrganisationId_Null_ReturnsError()
        {
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var soln      = Creator.GetSolution(orgId: null);

            soln.OrganisationId = null;

            validator.MustBeValidOrganisationId();
            var valres = validator.Validate(soln);

            valres.Errors.Should()
            .Contain(x => x.ErrorMessage == "Invalid OrganisationId")
            .And
            .Contain(x => x.ErrorMessage == "'Organisation Id' must not be empty.")
            .And
            .HaveCount(2);
        }
        public void MustBeFromSameOrganisationOrAdmin_Different_ReturnsError(
            [Values(
                 Roles.Buyer,
                 Roles.Supplier)]
            string role)
        {
            _context.Setup(x => x.HttpContext).Returns(Creator.GetContext(role: role));
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var soln      = Creator.GetSolution();

            validator.MustBeFromSameOrganisationOrAdmin();
            var valres = validator.Validate(soln);

            valres.Errors.Should()
            .ContainSingle(x => x.ErrorMessage == "Must be from same organisation")
            .And
            .HaveCount(1);
        }
        public void MustBePendingToChangeVersion_NonDraft_ReturnsError(SolutionStatus status)
        {
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var soln      = Creator.GetSolution(status: status);

            soln.Version = "New version";
            var solnOld = Creator.GetSolution(status: status, id: soln.Id);

            solnOld.Version = "Original version";
            _solutionDatastore.Setup(x => x.ById(soln.Id)).Returns(solnOld);

            validator.MustBePendingToChangeVersion();
            var valres = validator.Validate(soln);

            valres.Errors.Should()
            .ContainSingle(x => x.ErrorMessage == "Can only change version in Draft")
            .And
            .HaveCount(1);
        }
        public void MustBeValidStatusTransition_Invalid_ReturnsError(SolutionStatus oldStatus, SolutionStatus newStatus, string role)
        {
            var solnId = Guid.NewGuid().ToString();

            _context.Setup(x => x.HttpContext).Returns(Creator.GetContext(role: role));
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var oldSoln   = Creator.GetSolution(id: solnId, status: oldStatus);
            var newSoln   = Creator.GetSolution(id: solnId, status: newStatus);

            _solutionDatastore.Setup(x => x.ById(solnId)).Returns(oldSoln);

            validator.MustBeValidStatusTransition();
            var valres = validator.Validate(newSoln);

            valres.Errors.Should()
            .ContainSingle(x => x.ErrorMessage == "Invalid Status transition")
            .And
            .HaveCount(1);
        }
        public void MustBeValidStatusTransition_FinalState_ReturnsError(
            #region params
            [Values(
                 SolutionStatus.Approved,
                 SolutionStatus.Failed)]
            SolutionStatus oldStatus,
            [Values(
                 SolutionStatus.Failed,
                 SolutionStatus.Draft,
                 SolutionStatus.Registered,
                 SolutionStatus.CapabilitiesAssessment,
                 SolutionStatus.StandardsCompliance,
                 SolutionStatus.SolutionPage,
                 SolutionStatus.FinalApproval,
                 SolutionStatus.Approved)]
            SolutionStatus newStatus,
            [Values(
                 Roles.Admin,
                 Roles.Buyer,
                 Roles.Supplier)]
            #endregion
            string role)
        {
            var solnId = Guid.NewGuid().ToString();

            _context.Setup(x => x.HttpContext).Returns(Creator.GetContext(role: role));
            var validator = new SolutionsValidator(_context.Object, _logger.Object, _solutionDatastore.Object, _organisationDatastore.Object, _env.Object);
            var oldSoln   = Creator.GetSolution(id: solnId, status: oldStatus);
            var newSoln   = Creator.GetSolution(id: solnId, status: newStatus);

            _solutionDatastore.Setup(x => x.ById(solnId)).Returns(oldSoln);

            validator.MustBeValidStatusTransition();
            var valres = validator.Validate(newSoln);

            valres.Errors.Should()
            .ContainSingle(x => x.ErrorMessage == "Invalid Status transition")
            .And
            .HaveCount(1);
        }