diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 8786119..0bff5c9 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -17,10 +17,18 @@ on: - '.github/**' jobs: - build-and-test: - name: "Build and test" - uses: nfdi4plants/actions-workflows/.github/workflows/build-and-test-solution.yml@main - with: - solution: ./arc-validation-packages.sln - checkout-submodules: true - configuration: Release \ No newline at end of file + build-and-test-linux: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.x.x + - name: Run integration test + working-directory: ./ + run: dotnet test -v:normal \ No newline at end of file diff --git a/arc-validation-packages.sln b/arc-validation-packages.sln index da3924d..4e9bc5f 100644 --- a/arc-validation-packages.sln +++ b/arc-validation-packages.sln @@ -1,39 +1,41 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31903.59 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "ValidationPackages.Tests", "tests\ValidationPackages.Tests.fsproj", "{D9970D1D-9603-4C7A-9252-6A56CBE21062}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sln", "sln", "{55422101-E1FF-4846-B42C-445298D60D5C}" - ProjectSection(SolutionItems) = preProject - .gitignore = .gitignore - global.json = global.json - LICENSE = LICENSE - README.md = README.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".ci", ".ci", "{8CF8F7A6-E0A5-4B72-8FEF-52084354A4CF}" - ProjectSection(SolutionItems) = preProject - .github\workflows\manage-issues.yml = .github\workflows\manage-issues.yml - .github\workflows\run-tests.yml = .github\workflows\run-tests.yml - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D9970D1D-9603-4C7A-9252-6A56CBE21062}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D9970D1D-9603-4C7A-9252-6A56CBE21062}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D9970D1D-9603-4C7A-9252-6A56CBE21062}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D9970D1D-9603-4C7A-9252-6A56CBE21062}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {761E9831-7AB0-48D9-B549-413DD7A390FF} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "ValidationPackages.Tests", "tests\ValidationPackages.Tests.fsproj", "{D9970D1D-9603-4C7A-9252-6A56CBE21062}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sln", "sln", "{55422101-E1FF-4846-B42C-445298D60D5C}" + ProjectSection(SolutionItems) = preProject + .gitignore = .gitignore + global.json = global.json + integrationTests_script.fsx = integrationTests_script.fsx + LICENSE = LICENSE + playground.fsx = playground.fsx + README.md = README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".ci", ".ci", "{8CF8F7A6-E0A5-4B72-8FEF-52084354A4CF}" + ProjectSection(SolutionItems) = preProject + .github\workflows\manage-issues.yml = .github\workflows\manage-issues.yml + .github\workflows\run-tests.yml = .github\workflows\run-tests.yml + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D9970D1D-9603-4C7A-9252-6A56CBE21062}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D9970D1D-9603-4C7A-9252-6A56CBE21062}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9970D1D-9603-4C7A-9252-6A56CBE21062}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D9970D1D-9603-4C7A-9252-6A56CBE21062}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {761E9831-7AB0-48D9-B549-413DD7A390FF} + EndGlobalSection +EndGlobal diff --git a/integrationTests_script.fsx b/integrationTests_script.fsx new file mode 100644 index 0000000..d400558 --- /dev/null +++ b/integrationTests_script.fsx @@ -0,0 +1,93 @@ +#r "nuget: Xunit" +#r "nuget: Fake.DotNet.Cli" + + +open Xunit +open Fake.Core + +open System.Xml + + +let runTool (tool: string) (args: string []) (dir:string) = + CreateProcess.fromRawCommand tool args + |> CreateProcess.withWorkingDirectory dir + |> CreateProcess.redirectOutput + |> Proc.run + + +//let result = runTool "dotnet" [|"fsi"; @"C:\Repos\nfdi4plants\arc-validation-packages\validation_packages\invenio\invenio@3.0.0.fsx"|] @"C:\Repos\nfdi4plants\arc-validation-packages\tests\fixtures\testARC_empty\" +let result = runTool "dotnet" [|"fsi"; @"C:\Repos\nfdi4plants\arc-validation-packages\validation_packages\invenio\invenio@3.0.0.fsx"|] @"C:\Repos\nfdi4plants\arc-validation-packages\tests\fixtures\testARC_emptyContactsColumn\" + + +type JUnitResults = { + PassedTests: string list + FailedTests: string list + ErroredTests: string list +} with + static member fromJUnitFile (path:string) = + let doc = new XmlDocument() + doc.Load(path) + let suite = doc.SelectNodes("/testsuites/testsuite[@name='arc-validate']").Item(0); + let testCases = suite.SelectNodes("testcase") |> Seq.cast + { + PassedTests = + testCases + |> Seq.filter (fun tc -> tc.SelectNodes("failure").Count = 0) + |> Seq.map (fun tc -> tc.Attributes.["name"].Value) + |> Seq.toList + |> List.sort + + FailedTests = + testCases + |> Seq.filter (fun tc -> tc.SelectNodes("failure").Count > 0) + |> Seq.map (fun tc -> tc.Attributes.["name"].Value) + |> Seq.toList + |> List.sort + + ErroredTests = + testCases + |> Seq.filter (fun tc -> tc.SelectNodes("error").Count > 0) + |> Seq.map (fun tc -> tc.Attributes.["name"].Value) + |> Seq.toList + |> List.sort + } + + static member getTotalTestCount (res : JUnitResults) = + res.ErroredTests.Length + res.FailedTests.Length + res.PassedTests.Length + + +let jUnitRes = JUnitResults.fromJUnitFile @"C:\Repos\nfdi4plants\arc-validation-packages\tests\fixtures\ArcPrototype\.arc-validate-results\invenio@3.0.0\validation_report.xml" + +null = null + +let doc = new XmlDocument() +doc.Load(@"C:\Repos\nfdi4plants\arc-validation-packages\tests\fixtures\ArcPrototype\.arc-validate-results\invenio@3.0.0\validation_report.xml") +let suite = + doc.SelectNodes("/testsuites/testsuite[@name='arc-validate']").Item(0) + |> fun r -> + if isNull r then + doc.SelectNodes("/testsuites/testsuite[@name='fsi']").Item(0) + else r +let testCases = suite.SelectNodes("testcase") |> Seq.cast +{ + PassedTests = + testCases + |> Seq.filter (fun tc -> tc.SelectNodes("failure").Count = 0) + |> Seq.map (fun tc -> tc.Attributes.["name"].Value) + |> Seq.toList + |> List.sort + + FailedTests = + testCases + |> Seq.filter (fun tc -> tc.SelectNodes("failure").Count > 0) + |> Seq.map (fun tc -> tc.Attributes.["name"].Value) + |> Seq.toList + |> List.sort + + ErroredTests = + testCases + |> Seq.filter (fun tc -> tc.SelectNodes("error").Count > 0) + |> Seq.map (fun tc -> tc.Attributes.["name"].Value) + |> Seq.toList + |> List.sort +} \ No newline at end of file diff --git a/playground.fsx b/playground.fsx new file mode 100644 index 0000000..f74169f --- /dev/null +++ b/playground.fsx @@ -0,0 +1,147 @@ +let []PACKAGE_METADATA = """(* +--- +Name: invenio +Summary: Validates if the ARC contains the necessary metadata to be publishable via Invenio. +Description: | + Validates if the ARC contains the necessary metadata to be publishable via Invenio. + The following metadata is required: + - Investigation has title and description + - All persons in Investigation Contacts must have a name, last name, affiliation and valid email +MajorVersion: 3 +MinorVersion: 0 +PatchVersion: 0 +Publish: true +Authors: + - FullName: Oliver Maus + Affiliation: DataPLANT + - FullName: Christopher Lux + Email: lux@csbiology.de + Affiliation: RPTU Kaiserslautern + AffiliationLink: http://rptu.de/startseite + - FullName: Lukas Weil + Email: weil@rptu.de + Affiliation: DataPLANT +Tags: + - Name: ARC + - Name: data publication +ReleaseNotes: | + - Fix package passing validation against Investigation file containing only section keys +--- +*)""" + +#r "nuget: ARCExpect, 4.0.1" + +open ControlledVocabulary +open Expecto +open ARCExpect +open ARCTokenization +open ARCTokenization.StructuralOntology +open System.IO + +// Input: +//let arcDir = Directory.GetCurrentDirectory() +let arcDir = @"C:\Repos\nfdi4plants\arc-validation-packages\tests\fixtures\ArcPrototype\" + +// Values: +let absoluteDirectoryPaths = FileSystem.parseARCFileSystem arcDir + +let investigationMetadata = + absoluteDirectoryPaths + |> Investigation.parseMetadataSheetsFromTokens() arcDir + |> List.concat + +#r "nuget: Xunit" +open Xunit + +investigationMetadata +|> List.exists ( + fun ip -> + Param.getCvAccession ip = "INVMSO:00000009" && + Param.getValueAsString ip |> String.isNullOrWhiteSpace |> not && + match Param.getParamValue ip with | CvValue x -> x.Accession = "AGMO:00000001" | _ -> false +) +investigationMetadata |> List.filter (fun ip -> Param.getValueAsString ip |> String.isNullOrWhiteSpace |> not && Param.getCvAccession ip = "INVMSO:00000009") + + + +let expectedTitleCvPExists = + investigationMetadata + |> List.exists ( + fun ip -> + Param.getCvAccession ip = "INVMSO:00000009" && + Param.getValueAsString ip |> String.isNullOrWhiteSpace |> not && + match Param.getParamValue ip with | CvValue x -> x.Accession = "AGMO:00000001" | _ -> false + ) + +Assert.True expectedTitleCvPExists + + +// Validation Cases: +let cases = + testList INVMSO.``Investigation Metadata``.INVESTIGATION.key.Name [ + // Investigation has title + ARCExpect.validationCase (TestID.Name INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Title``.Name) { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm + INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Title`` + } + // Investigation has description + ARCExpect.validationCase (TestID.Name INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Description``.Name) { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm + INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Description`` + } + // Investigation has contacts with name, last name, affiliation and email + // Investigation Person First Name + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name`` + } + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name``.Name} is not empty") { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name``) + |> Seq.iter Validate.Param.ValueIsNotEmpty + } + // Investigation Person Last Name + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name`` + } + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name``.Name} is not empty") { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name``) + |> Seq.iter Validate.Param.ValueIsNotEmpty + } + // Investigation Person Affiliation + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation`` + } + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation``.Name} is not empty") { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation``) + |> Seq.filter (Param.getValueAsString >> (<>) "Metadata Section Key") + |> Seq.iter Validate.Param.ValueIsNotEmpty + } + // Investigation Person Email + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Email``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Email`` + } + ARCExpect.validationCase (TestID.Name INVMSO.``Investigation Metadata``. ``INVESTIGATION CONTACTS``.``Investigation Person Email``.Name) { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Email``) + |> Seq.filter (Param.getValueAsString >> (<>) "Metadata Section Key") + |> Seq.iter (Validate.Param.ValueMatchesRegex StringValidationPattern.email) + } + ] + +// Execution: + +Setup.ValidationPackage( + metadata = Setup.Metadata(PACKAGE_METADATA), + CriticalValidationCases = [cases] +) +|> Execute.ValidationPipeline( + basePath = arcDir +) \ No newline at end of file diff --git a/tests/GitSubmodulesTests.fs b/tests/GitSubmodulesTests.fs index 5419e71..3cb15ab 100644 --- a/tests/GitSubmodulesTests.fs +++ b/tests/GitSubmodulesTests.fs @@ -3,10 +3,11 @@ open System open System.IO open Xunit +open ValidationPackages.Tests [] let ``ArcPrototype commit hash is correct`` () = Assert.Equal( - ReferenceObjects.expected_prototype_commit_hash, + ReferenceObjects.General.expected_prototype_commit_hash, TestObjects.prototypeCommitHash ) diff --git a/tests/ReferenceObjects.fs b/tests/ReferenceObjects.fs index 3f1d193..c73bf35 100644 --- a/tests/ReferenceObjects.fs +++ b/tests/ReferenceObjects.fs @@ -1,5 +1,66 @@ -module ReferenceObjects +namespace ValidationPackages.Tests.ReferenceObjects open System.IO +open ARCExpect -let expected_prototype_commit_hash = "2635598d9ea365c7ce545a9f279cca39af3de5df" \ No newline at end of file + +[] +module General = + + let expected_prototype_commit_hash = "2635598d9ea365c7ce545a9f279cca39af3de5df" + + +module invenio = + + module ArcPrototype = + + let validationResultCritical = + ValidationResult.create(10,10,0,0) + + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) + + + module testARC_empty = + + let validationResultCritical = + ValidationResult.create(10,4,6,0) + + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) + + + module testARC_emptyContactsColumn = + + let validationResultCritical = + ValidationResult.create(10,6,4,0) + + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) + + + module testARC_shiftedContactsCells = + + let validationResultCritical = + ValidationResult.create(10,9,1,0) + + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) + + + module testARC_shiftedTitleCell = + + let validationResultCritical = + ValidationResult.create(10,10,0,0) + + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) + + + module testARC_wrongEmail = + + let validationResultCritical = + ValidationResult.create(10,9,1,0) + + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) \ No newline at end of file diff --git a/tests/TestUtils.fs b/tests/TestUtils.fs index cf80903..9c57c68 100644 --- a/tests/TestUtils.fs +++ b/tests/TestUtils.fs @@ -1,11 +1,12 @@ module TestUtils -open System -open System.IO -open type System.Environment + +open System.Xml + open Fake.Core open Fake.DotNet + let runScriptWithArgs (scriptPath: string) (args: string []) = let args = Array.concat [|[|scriptPath|]; args|] DotNet.exec @@ -27,4 +28,46 @@ let runTool (tool: string) (args: string []) (dir:string) = let getCommitHash path = let output = runTool "git" [|"rev-parse"; "HEAD"|] path - output \ No newline at end of file + output + + +type JUnitResults = { + PassedTests: string list + FailedTests: string list + ErroredTests: string list +} with + static member fromJUnitFile (path : string) = + let doc = new XmlDocument() + doc.Load(path) + let suite = + doc.SelectNodes("/testsuites/testsuite[@name='arc-validate']").Item(0) + |> fun r -> + if isNull r then + doc.SelectNodes("/testsuites/testsuite[@name='fsi']").Item(0) + else r + let testCases = suite.SelectNodes("testcase") |> Seq.cast + { + PassedTests = + testCases + |> Seq.filter (fun tc -> tc.SelectNodes("failure").Count = 0) + |> Seq.map (fun tc -> tc.Attributes.["name"].Value) + |> Seq.toList + |> List.sort + + FailedTests = + testCases + |> Seq.filter (fun tc -> tc.SelectNodes("failure").Count > 0) + |> Seq.map (fun tc -> tc.Attributes.["name"].Value) + |> Seq.toList + |> List.sort + + ErroredTests = + testCases + |> Seq.filter (fun tc -> tc.SelectNodes("error").Count > 0) + |> Seq.map (fun tc -> tc.Attributes.["name"].Value) + |> Seq.toList + |> List.sort + } + + static member getTotalTestCount (res : JUnitResults) = + res.ErroredTests.Length + res.FailedTests.Length + res.PassedTests.Length \ No newline at end of file diff --git a/tests/Tests.fs b/tests/Tests.fs deleted file mode 100644 index 7d11a64..0000000 --- a/tests/Tests.fs +++ /dev/null @@ -1,8 +0,0 @@ -module Tests - -open System -open Xunit - -[] -let ``My test`` () = - Assert.True(true) diff --git a/tests/ValidationPackages.Tests.fsproj b/tests/ValidationPackages.Tests.fsproj index e94c82f..3ac28c7 100644 --- a/tests/ValidationPackages.Tests.fsproj +++ b/tests/ValidationPackages.Tests.fsproj @@ -1,4 +1,4 @@ - + net8.0 @@ -8,24 +8,28 @@ + - - + + + + + diff --git a/tests/fixtures/testARC_empty/assays/.gitkeep b/tests/fixtures/testARC_empty/assays/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_empty/isa.investigation.xlsx b/tests/fixtures/testARC_empty/isa.investigation.xlsx new file mode 100644 index 0000000..c6d4241 Binary files /dev/null and b/tests/fixtures/testARC_empty/isa.investigation.xlsx differ diff --git a/tests/fixtures/testARC_empty/runs/.gitkeep b/tests/fixtures/testARC_empty/runs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_empty/studies/.gitkeep b/tests/fixtures/testARC_empty/studies/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_empty/workflows/.gitkeep b/tests/fixtures/testARC_empty/workflows/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_emptyContactsColumn/assays/.gitkeep b/tests/fixtures/testARC_emptyContactsColumn/assays/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_emptyContactsColumn/isa.investigation.xlsx b/tests/fixtures/testARC_emptyContactsColumn/isa.investigation.xlsx new file mode 100644 index 0000000..5df3b56 Binary files /dev/null and b/tests/fixtures/testARC_emptyContactsColumn/isa.investigation.xlsx differ diff --git a/tests/fixtures/testARC_emptyContactsColumn/runs/.gitkeep b/tests/fixtures/testARC_emptyContactsColumn/runs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_emptyContactsColumn/studies/.gitkeep b/tests/fixtures/testARC_emptyContactsColumn/studies/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_emptyContactsColumn/workflows/.gitkeep b/tests/fixtures/testARC_emptyContactsColumn/workflows/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_shiftedContactsCells/assays/.gitkeep b/tests/fixtures/testARC_shiftedContactsCells/assays/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_shiftedContactsCells/isa.investigation.xlsx b/tests/fixtures/testARC_shiftedContactsCells/isa.investigation.xlsx new file mode 100644 index 0000000..dad300b Binary files /dev/null and b/tests/fixtures/testARC_shiftedContactsCells/isa.investigation.xlsx differ diff --git a/tests/fixtures/testARC_shiftedContactsCells/runs/.gitkeep b/tests/fixtures/testARC_shiftedContactsCells/runs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_shiftedContactsCells/studies/.gitkeep b/tests/fixtures/testARC_shiftedContactsCells/studies/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_shiftedContactsCells/workflows/.gitkeep b/tests/fixtures/testARC_shiftedContactsCells/workflows/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_shiftedTitleCell/assays/.gitkeep b/tests/fixtures/testARC_shiftedTitleCell/assays/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_shiftedTitleCell/isa.investigation.xlsx b/tests/fixtures/testARC_shiftedTitleCell/isa.investigation.xlsx new file mode 100644 index 0000000..42d13f1 Binary files /dev/null and b/tests/fixtures/testARC_shiftedTitleCell/isa.investigation.xlsx differ diff --git a/tests/fixtures/testARC_shiftedTitleCell/runs/.gitkeep b/tests/fixtures/testARC_shiftedTitleCell/runs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_shiftedTitleCell/studies/.gitkeep b/tests/fixtures/testARC_shiftedTitleCell/studies/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_shiftedTitleCell/workflows/.gitkeep b/tests/fixtures/testARC_shiftedTitleCell/workflows/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_wrongEmail/assays/.gitkeep b/tests/fixtures/testARC_wrongEmail/assays/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_wrongEmail/isa.investigation.xlsx b/tests/fixtures/testARC_wrongEmail/isa.investigation.xlsx new file mode 100644 index 0000000..3513260 Binary files /dev/null and b/tests/fixtures/testARC_wrongEmail/isa.investigation.xlsx differ diff --git a/tests/fixtures/testARC_wrongEmail/runs/.gitkeep b/tests/fixtures/testARC_wrongEmail/runs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_wrongEmail/studies/.gitkeep b/tests/fixtures/testARC_wrongEmail/studies/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_wrongEmail/workflows/.gitkeep b/tests/fixtures/testARC_wrongEmail/workflows/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/validationReport/invenio/3.0.0/ArcPrototype/validation_report.xml b/tests/fixtures/validationReport/invenio/3.0.0/ArcPrototype/validation_report.xml new file mode 100644 index 0000000..dd02edd --- /dev/null +++ b/tests/fixtures/validationReport/invenio/3.0.0/ArcPrototype/validation_report.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/fixtures/validationReport/invenio/3.0.0/testARC_empty/validation_report.xml b/tests/fixtures/validationReport/invenio/3.0.0/testARC_empty/validation_report.xml new file mode 100644 index 0000000..31a3904 --- /dev/null +++ b/tests/fixtures/validationReport/invenio/3.0.0/testARC_empty/validation_report.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/fixtures/validationReport/invenio/3.0.0/testARC_emptyContactsColumn/validation_report.xml b/tests/fixtures/validationReport/invenio/3.0.0/testARC_emptyContactsColumn/validation_report.xml new file mode 100644 index 0000000..702259e --- /dev/null +++ b/tests/fixtures/validationReport/invenio/3.0.0/testARC_emptyContactsColumn/validation_report.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/fixtures/validationReport/invenio/3.0.0/testARC_shiftedContactsCells/validation_report.xml b/tests/fixtures/validationReport/invenio/3.0.0/testARC_shiftedContactsCells/validation_report.xml new file mode 100644 index 0000000..b929bf2 --- /dev/null +++ b/tests/fixtures/validationReport/invenio/3.0.0/testARC_shiftedContactsCells/validation_report.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/fixtures/validationReport/invenio/3.0.0/testARC_shiftedTitleCell/validation_report.xml b/tests/fixtures/validationReport/invenio/3.0.0/testARC_shiftedTitleCell/validation_report.xml new file mode 100644 index 0000000..950e099 --- /dev/null +++ b/tests/fixtures/validationReport/invenio/3.0.0/testARC_shiftedTitleCell/validation_report.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/fixtures/validationReport/invenio/3.0.0/testARC_wrongEmail/validation_report.xml b/tests/fixtures/validationReport/invenio/3.0.0/testARC_wrongEmail/validation_report.xml new file mode 100644 index 0000000..06d919a --- /dev/null +++ b/tests/fixtures/validationReport/invenio/3.0.0/testARC_wrongEmail/validation_report.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/fixtures/validationSummary/invenio/3.0.0/ArcPrototype/validation_summary.json b/tests/fixtures/validationSummary/invenio/3.0.0/ArcPrototype/validation_summary.json new file mode 100644 index 0000000..deba789 --- /dev/null +++ b/tests/fixtures/validationSummary/invenio/3.0.0/ArcPrototype/validation_summary.json @@ -0,0 +1 @@ +{"Critical":{"HasFailures":false,"Total":10,"Passed":10,"Failed":0,"Errored":0},"NonCritical":{"HasFailures":false,"Total":0,"Passed":0,"Failed":0,"Errored":0},"ValidationPackage":{"Name":"invenio","Version":"3.0.0","Summary":"Validates if the ARC contains the necessary metadata to be publishable via Invenio.","Description":"Validates if the ARC contains the necessary metadata to be publishable via Invenio.\nThe following metadata is required:\n- Investigation has title and description\n- All persons in Investigation Contacts must have a name, last name, affiliation and valid email\n"}} \ No newline at end of file diff --git a/tests/fixtures/validationSummary/invenio/3.0.0/testARC_empty/validation_summary.json b/tests/fixtures/validationSummary/invenio/3.0.0/testARC_empty/validation_summary.json new file mode 100644 index 0000000..ae7b759 --- /dev/null +++ b/tests/fixtures/validationSummary/invenio/3.0.0/testARC_empty/validation_summary.json @@ -0,0 +1 @@ +{"Critical":{"HasFailures":true,"Total":10,"Passed":4,"Failed":6,"Errored":0},"NonCritical":{"HasFailures":false,"Total":0,"Passed":0,"Failed":0,"Errored":0},"ValidationPackage":{"Name":"invenio","Version":"3.0.0","Summary":"Validates if the ARC contains the necessary metadata to be publishable via Invenio.","Description":"Validates if the ARC contains the necessary metadata to be publishable via Invenio.\nThe following metadata is required:\n- Investigation has title and description\n- All persons in Investigation Contacts must have a name, last name, affiliation and valid email\n"}} \ No newline at end of file diff --git a/tests/fixtures/validationSummary/invenio/3.0.0/testARC_emptyContactsColumn/validation_summary.json b/tests/fixtures/validationSummary/invenio/3.0.0/testARC_emptyContactsColumn/validation_summary.json new file mode 100644 index 0000000..ae7b759 --- /dev/null +++ b/tests/fixtures/validationSummary/invenio/3.0.0/testARC_emptyContactsColumn/validation_summary.json @@ -0,0 +1 @@ +{"Critical":{"HasFailures":true,"Total":10,"Passed":4,"Failed":6,"Errored":0},"NonCritical":{"HasFailures":false,"Total":0,"Passed":0,"Failed":0,"Errored":0},"ValidationPackage":{"Name":"invenio","Version":"3.0.0","Summary":"Validates if the ARC contains the necessary metadata to be publishable via Invenio.","Description":"Validates if the ARC contains the necessary metadata to be publishable via Invenio.\nThe following metadata is required:\n- Investigation has title and description\n- All persons in Investigation Contacts must have a name, last name, affiliation and valid email\n"}} \ No newline at end of file diff --git a/tests/fixtures/validationSummary/invenio/3.0.0/testARC_shiftedContactsCells/validation_summary.json b/tests/fixtures/validationSummary/invenio/3.0.0/testARC_shiftedContactsCells/validation_summary.json new file mode 100644 index 0000000..2453b02 --- /dev/null +++ b/tests/fixtures/validationSummary/invenio/3.0.0/testARC_shiftedContactsCells/validation_summary.json @@ -0,0 +1 @@ +{"Critical":{"HasFailures":true,"Total":10,"Passed":9,"Failed":1,"Errored":0},"NonCritical":{"HasFailures":false,"Total":0,"Passed":0,"Failed":0,"Errored":0},"ValidationPackage":{"Name":"invenio","Version":"3.0.0","Summary":"Validates if the ARC contains the necessary metadata to be publishable via Invenio.","Description":"Validates if the ARC contains the necessary metadata to be publishable via Invenio.\nThe following metadata is required:\n- Investigation has title and description\n- All persons in Investigation Contacts must have a name, last name, affiliation and valid email\n"}} \ No newline at end of file diff --git a/tests/fixtures/validationSummary/invenio/3.0.0/testARC_shiftedTitleCell/validation_summary.json b/tests/fixtures/validationSummary/invenio/3.0.0/testARC_shiftedTitleCell/validation_summary.json new file mode 100644 index 0000000..deba789 --- /dev/null +++ b/tests/fixtures/validationSummary/invenio/3.0.0/testARC_shiftedTitleCell/validation_summary.json @@ -0,0 +1 @@ +{"Critical":{"HasFailures":false,"Total":10,"Passed":10,"Failed":0,"Errored":0},"NonCritical":{"HasFailures":false,"Total":0,"Passed":0,"Failed":0,"Errored":0},"ValidationPackage":{"Name":"invenio","Version":"3.0.0","Summary":"Validates if the ARC contains the necessary metadata to be publishable via Invenio.","Description":"Validates if the ARC contains the necessary metadata to be publishable via Invenio.\nThe following metadata is required:\n- Investigation has title and description\n- All persons in Investigation Contacts must have a name, last name, affiliation and valid email\n"}} \ No newline at end of file diff --git a/tests/fixtures/validationSummary/invenio/3.0.0/testARC_wrongEmail/validation_summary.json b/tests/fixtures/validationSummary/invenio/3.0.0/testARC_wrongEmail/validation_summary.json new file mode 100644 index 0000000..2453b02 --- /dev/null +++ b/tests/fixtures/validationSummary/invenio/3.0.0/testARC_wrongEmail/validation_summary.json @@ -0,0 +1 @@ +{"Critical":{"HasFailures":true,"Total":10,"Passed":9,"Failed":1,"Errored":0},"NonCritical":{"HasFailures":false,"Total":0,"Passed":0,"Failed":0,"Errored":0},"ValidationPackage":{"Name":"invenio","Version":"3.0.0","Summary":"Validates if the ARC contains the necessary metadata to be publishable via Invenio.","Description":"Validates if the ARC contains the necessary metadata to be publishable via Invenio.\nThe following metadata is required:\n- Investigation has title and description\n- All persons in Investigation Contacts must have a name, last name, affiliation and valid email\n"}} \ No newline at end of file diff --git a/tests/invenio@3.0.0.fs b/tests/invenio@3.0.0.fs index e083803..a01d8da 100644 --- a/tests/invenio@3.0.0.fs +++ b/tests/invenio@3.0.0.fs @@ -1,2 +1,218 @@ -module invenio_3 +module invenio + +open ValidationPackages.Tests +open TestUtils + +open Xunit +open ARCExpect + +open System.IO +open System + + +//let arcDir = Path.Combine(__SOURCE_DIRECTORY__, "fixtures", "ArcPrototype") + +//let absoluteDirectoryPaths = FileSystem.parseARCFileSystem arcDir + +//let investigationMetadata = +// absoluteDirectoryPaths +// |> Investigation.parseMetadataSheetsFromTokens() arcDir +// |> List.concat + +//// Investigation has title +//let expectedTitleCvPExists = +// investigationMetadata +// |> List.exists ( +// fun ip -> +// Param.getCvAccession ip = "INVMSO:00000009" && +// Param.getValueAsString ip |> String.IsNullOrWhiteSpace |> not && +// match Param.getParamValue ip with | CvValue x -> x.Accession = "AGMO:00000001" | _ -> false +// ) + +//Assert.True expectedTitleCvPExists + + +type BaseTool_Fixture(scriptName : string, version : string, arcfolder : string) = + + let result = runTool "dotnet" [|"fsi"; $"../../validation_packages/{scriptName}/{scriptName}@{version}.fsx"|] $"fixtures/{arcfolder}" + + let arcExpectValidationResult = ARCExpect.ValidationSummary.fromJson (File.ReadAllText $"fixtures/{arcfolder}/.arc-validate-results/{scriptName}@{version}/validation_summary.json") + + let jUnitResult = JUnitResults.fromJUnitFile $"fixtures/{arcfolder}/.arc-validate-results/{scriptName}@{version}/validation_report.xml" + + let jUnitExpected = JUnitResults.fromJUnitFile $"fixtures/validationReport/{scriptName}/{version}/{arcfolder}/validation_report.xml" + + interface IDisposable with + override this.Dispose() = + Directory.Delete($"fixtures/{arcfolder}/.arc-validate-results/{scriptName}@{version}/", true) + + member this.Result = result + + member this.ArcExpectValidationResult = arcExpectValidationResult + + member this.JUnitResult = jUnitResult + + member this.JUnitExpected = jUnitExpected + + +type ArcPrototype_Fixture() = + + inherit BaseTool_Fixture("invenio", "3.0.0", "ArcPrototype") + + +type ArcPrototype() = + + let tool_fixture = new ArcPrototype_Fixture() + + interface IClassFixture + + member this.Fixture with get() = tool_fixture + + [] + member this.``result Exitcode is 0`` () = + Assert.Equal(0, this.Fixture.Result.ExitCode) + + [] + member this.``validation_summary JSON is equal`` () = + Assert.Equal(ReferenceObjects.invenio.ArcPrototype.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.invenio.ArcPrototype.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + + [] + member this.``validation_report XML is equal`` () = + Assert.Equal(this.Fixture.JUnitExpected, this.Fixture.JUnitResult) + + +type testARC_empty_Fixture() = + + inherit BaseTool_Fixture("invenio", "3.0.0", "testARC_empty") + + +type testARC_empty() = + + let tool_fixture = new testARC_empty_Fixture() + + interface IClassFixture + + member this.Fixture with get() = tool_fixture + + [] + member this.``result Exitcode is 0`` () = + Assert.Equal(0, this.Fixture.Result.ExitCode) + + [] + member this.``validation_summary JSON is equal`` () = + Assert.Equal(ReferenceObjects.invenio.testARC_empty.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.invenio.testARC_empty.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + + [] + member this.``validation_report XML is equal`` () = + Assert.Equal(this.Fixture.JUnitExpected, this.Fixture.JUnitResult) + + +type testARC_emptyContactsColumn_Fixture() = + + inherit BaseTool_Fixture("invenio", "3.0.0", "testARC_emptyContactsColumn") + + +type testARC_emptyContactsColumn() = + + let tool_fixture = new testARC_emptyContactsColumn_Fixture() + + interface IClassFixture + + member this.Fixture with get() = tool_fixture + + [] + member this.``result Exitcode is 0`` () = + Assert.Equal(0, this.Fixture.Result.ExitCode) + + [] + member this.``validation_summary JSON is equal`` () = + Assert.Equal(ReferenceObjects.invenio.testARC_emptyContactsColumn.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.invenio.testARC_emptyContactsColumn.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + + [] + member this.``validation_report XML is equal`` () = + Assert.Equal(this.Fixture.JUnitExpected, this.Fixture.JUnitResult) + + +type testARC_shiftedContactsCells_Fixture() = + + inherit BaseTool_Fixture("invenio", "3.0.0", "testARC_shiftedContactsCells") + + +type testARC_shiftedContactsCells() = + + let tool_fixture = new testARC_shiftedContactsCells_Fixture() + + interface IClassFixture + + member this.Fixture with get() = tool_fixture + + [] + member this.``result Exitcode is 0`` () = + Assert.Equal(0, this.Fixture.Result.ExitCode) + + [] + member this.``validation_summary JSON is equal`` () = + Assert.Equal(ReferenceObjects.invenio.testARC_shiftedContactsCells.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.invenio.testARC_shiftedContactsCells.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + + [] + member this.``validation_report XML is equal`` () = + Assert.Equal(this.Fixture.JUnitExpected, this.Fixture.JUnitResult) + + +type testARC_shiftedTitleCell_Fixture() = + + inherit BaseTool_Fixture("invenio", "3.0.0", "testARC_shiftedTitleCell") + + +type testARC_shiftedTitleCell() = + + let tool_fixture = new testARC_shiftedTitleCell_Fixture() + + interface IClassFixture + + member this.Fixture with get() = tool_fixture + + [] + member this.``result Exitcode is 0`` () = + Assert.Equal(0, this.Fixture.Result.ExitCode) + + [] + member this.``validation_summary JSON is equal`` () = + Assert.Equal(ReferenceObjects.invenio.testARC_shiftedTitleCell.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.invenio.testARC_shiftedTitleCell.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + + [] + member this.``validation_report XML is equal`` () = + Assert.Equal(this.Fixture.JUnitExpected, this.Fixture.JUnitResult) + + +type testARC_wrongEmail_Fixture() = + + inherit BaseTool_Fixture("invenio", "3.0.0", "testARC_wrongEmail") + + +type testARC_wrongEmail() = + + let tool_fixture = new testARC_wrongEmail_Fixture() + + interface IClassFixture + + member this.Fixture with get() = tool_fixture + + [] + member this.``result Exitcode is 0`` () = + Assert.Equal(0, this.Fixture.Result.ExitCode) + + [] + member this.``validation_summary JSON is equal`` () = + Assert.Equal(ReferenceObjects.invenio.testARC_wrongEmail.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.invenio.testARC_wrongEmail.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + + [] + member this.``validation_report XML is equal`` () = + Assert.Equal(this.Fixture.JUnitExpected, this.Fixture.JUnitResult) \ No newline at end of file diff --git a/tests/xunit.runner.json b/tests/xunit.runner.json new file mode 100644 index 0000000..ba84dee --- /dev/null +++ b/tests/xunit.runner.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json", + "parallelizeTestCollections": false +} \ No newline at end of file diff --git a/validation_packages/invenio/invenio@3.0.0.fsx b/validation_packages/invenio/invenio@3.0.0.fsx index e69de29..23f3fc2 100644 --- a/validation_packages/invenio/invenio@3.0.0.fsx +++ b/validation_packages/invenio/invenio@3.0.0.fsx @@ -0,0 +1,121 @@ +let []PACKAGE_METADATA = """(* +--- +Name: invenio +Summary: Validates if the ARC contains the necessary metadata to be publishable via Invenio. +Description: | + Validates if the ARC contains the necessary metadata to be publishable via Invenio. + The following metadata is required: + - Investigation has title and description + - All persons in Investigation Contacts must have a name, last name, affiliation and valid email +MajorVersion: 3 +MinorVersion: 0 +PatchVersion: 0 +Publish: true +Authors: + - FullName: Oliver Maus + Affiliation: DataPLANT + - FullName: Christopher Lux + Email: lux@csbiology.de + Affiliation: RPTU Kaiserslautern + AffiliationLink: http://rptu.de/startseite + - FullName: Lukas Weil + Email: weil@rptu.de + Affiliation: DataPLANT +Tags: + - Name: ARC + - Name: data publication +ReleaseNotes: | + - Fix package passing validation against Investigation file containing only section keys +--- +*)""" + +#r "nuget: ARCExpect, 4.0.1" + +open ControlledVocabulary +open Expecto +open ARCExpect +open ARCTokenization +open ARCTokenization.StructuralOntology +open System.IO + +// Input: +let arcDir = Directory.GetCurrentDirectory() + +// Values: +let absoluteDirectoryPaths = FileSystem.parseARCFileSystem arcDir + +let investigationMetadata = + absoluteDirectoryPaths + |> Investigation.parseMetadataSheetsFromTokens() arcDir + |> List.concat + + +// Validation Cases: +let cases = + testList INVMSO.``Investigation Metadata``.INVESTIGATION.key.Name [ + // Investigation has title + ARCExpect.validationCase (TestID.Name INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Title``.Name) { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm + INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Title`` + } + // Investigation has description + ARCExpect.validationCase (TestID.Name INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Description``.Name) { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm + INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Description`` + } + // Investigation has contacts with name, last name, affiliation and email + // Investigation Person First Name + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name`` + } + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name``.Name} is not empty") { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name``) + |> Seq.iter Validate.Param.ValueIsNotEmpty + } + // Investigation Person Last Name + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name`` + } + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name``.Name} is not empty") { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name``) + |> Seq.iter Validate.Param.ValueIsNotEmpty + } + // Investigation Person Affiliation + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation`` + } + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation``.Name} is not empty") { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation``) + |> Seq.filter (Param.getValueAsString >> (<>) "Metadata Section Key") + |> Seq.iter Validate.Param.ValueIsNotEmpty + } + // Investigation Person Email + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Email``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Email`` + } + ARCExpect.validationCase (TestID.Name INVMSO.``Investigation Metadata``. ``INVESTIGATION CONTACTS``.``Investigation Person Email``.Name) { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Email``) + |> Seq.filter (Param.getValueAsString >> (<>) "Metadata Section Key") + |> Seq.iter (Validate.Param.ValueMatchesRegex StringValidationPattern.email) + } + ] + +// Execution: + +Setup.ValidationPackage( + metadata = Setup.Metadata(PACKAGE_METADATA), + CriticalValidationCases = [cases] +) +|> Execute.ValidationPipeline( + basePath = arcDir +) \ No newline at end of file