Feature - run JUnit tests from validator_cli (#835)

* WIP add initial test running code

* Importing test modules fix breaking tests 1

* Clean up pom dependencies, move execution before context load

* Re-org and document cli pom

* Set more dependencies to compile. Print entries in classpath

* Try running via internal Executors

* Clearer class names + provide clear output

* Clean up test summarys and output + update class regex to junit default

* Refactor to avoid having to extend class

* Trim down dependency additions in pom + javadoc

* Add the rest of the modules to TestExecutor

* Parse additional params for classname filter and module

* Add experimental JUnit 4 runner in case JUnit 5 hates us.

* Include JUnit4 tests via adapters. Need to refactor for better naming.

* Update LoadIgTests to JUnit 5

* Gentle refactor, print execution time

* Remove unnecessary interface, organize packages

* Remove cached resources (need to fix this)

* Allow setting of txCache globally for tests + fix r5 tests

* Mild refactor of TestExecutor + Reorder test execution

* Add fhirTestCasesDirectory to testConfig + get r4 tests working

* Add dstu2016may and dstu3 tests

* Add dstu2 tests

* Add convertors tests

* Refactor resourceNameForFile + don't copy existing files

* Get all txCache directories centrally and allow all to live in same dir

* Start extracting txCache resources

* Finish extracting txCache resources

* Fix failing GraphQLEngineTest

* Try an mvn install for the pull pipeline

* Clean and refactor

* Test coverage

* Fix GraphQLEngineTests for local jar run

* More refactoring, more tests

* Add bare test for TxCacheResourceExtractor

Co-authored-by: dotasek <david.otasek@smilecdr.com>
This commit is contained in:
dotasek 2022-06-14 17:04:00 -04:00 committed by GitHub
parent 2783a5e3aa
commit 1fee28fe84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
119 changed files with 1747 additions and 676 deletions

View File

@ -35,6 +35,9 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -52,6 +55,7 @@ import org.hl7.fhir.utilities.TextFile;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager; import org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager;
import org.hl7.fhir.utilities.npm.ToolsVersion; import org.hl7.fhir.utilities.npm.ToolsVersion;
import org.hl7.fhir.utilities.tests.ResourceLoaderTests;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NamedNodeMap;
@ -438,15 +442,45 @@ public class TestingUtilities {
return "Strings differ in length: "+Integer.toString(s1.length())+" vs "+Integer.toString(s2.length())+" but match to the end of the shortest"; return "Strings differ in length: "+Integer.toString(s1.length())+" vs "+Integer.toString(s2.length())+" but match to the end of the shortest";
return null; return null;
} }
public static String resourceNameToFile(String name) throws IOException { public static String resourceNameToFile(String name) throws IOException {
return Utilities.path(System.getProperty("user.dir"), "src", "test", "resources", name); //return Utilities.path(System.getProperty("user.dir"), "src", "test", "resources", name);
return resourceNameToFile(null, name);
} }
private static boolean fileForPathExists(String path) {
return new File(path).exists();
}
public static String generateResourcePath(String subFolder, String name) throws IOException {
String path = Utilities.path(System.getProperty("user.dir"), "src", "test", "resources", subFolder, name);
createParentDirectoryPathIfNotExists(Paths.get(path));
return path;
}
public static String resourceNameToFile(String subFolder, String name) throws IOException { public static String resourceNameToFile(String subFolder, String name) throws IOException {
return Utilities.path(System.getProperty("user.dir"), "src", "test", "resources", subFolder, name);
final String resourcePath = (subFolder != null ? subFolder + "/" : "") + name;
final String filePathFromClassLoader = TestingUtilities.class.getClassLoader().getResource(resourcePath).getPath();
if (fileForPathExists(filePathFromClassLoader)) {
return filePathFromClassLoader;
} else {
final Path newFilePath = (subFolder != null) ? Paths.get("target", subFolder, name) : Paths.get("target", name);
copyResourceToNewFile(resourcePath, newFilePath);
return newFilePath.toString();
}
}
private static void copyResourceToNewFile(String resourcePath, Path newFilePath) throws IOException {
createParentDirectoryPathIfNotExists(newFilePath);
ResourceLoaderTests.copyResourceToFile(TestingUtilities.class, newFilePath, resourcePath);
}
private static void createParentDirectoryPathIfNotExists(Path newFilePath) {
Path parent = newFilePath.getParent();
if (!parent.toFile().exists()) {
parent.toFile().mkdirs();
}
} }
} }

View File

@ -111,8 +111,10 @@ public class GraphQLEngineTests implements IGraphQLStorageServices {
StringBuilder str = new StringBuilder(); StringBuilder str = new StringBuilder();
gql.getOutput().setWriteWrapper(false); gql.getOutput().setWriteWrapper(false);
gql.getOutput().write(str, 0); gql.getOutput().write(str, 0);
TextFile.stringToFile(str.toString(), TestingUtilities.resourceNameToFile("graphql", output + ".out")); String actualFilePath = TestingUtilities.generateResourcePath("graphql", output + ".out");
msg = TestingUtilities.checkJsonIsSame(TestingUtilities.resourceNameToFile("graphql", output + ".out"), TestingUtilities.resourceNameToFile("graphql", output));
TextFile.stringToFile(str.toString(), actualFilePath);
msg = TestingUtilities.checkJsonIsSame(actualFilePath, TestingUtilities.resourceNameToFile("graphql", output));
Assertions.assertTrue(Utilities.noString(msg), msg); Assertions.assertTrue(Utilities.noString(msg), msg);
} else } else
Assertions.assertTrue(output.equals("$error"), "Error, but proper output was expected (" + msg + ")"); Assertions.assertTrue(output.equals("$error"), "Error, but proper output was expected (" + msg + ")");

View File

@ -27,7 +27,9 @@ import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.xhtml.NodeType; import org.hl7.fhir.utilities.xhtml.NodeType;
import org.hl7.fhir.utilities.xhtml.XhtmlComposer; import org.hl7.fhir.utilities.xhtml.XhtmlComposer;
import org.hl7.fhir.utilities.xhtml.XhtmlNode; import org.hl7.fhir.utilities.xhtml.XhtmlNode;
import org.junit.Assert;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
@ -74,13 +76,13 @@ public class NarrativeGeneratorTests {
DateTimeType dt = new DateTimeType(src); DateTimeType dt = new DateTimeType(src);
String actual = new DataRenderer(rc).display(dt); String actual = new DataRenderer(rc).display(dt);
Assert.assertTrue("Actual = "+actual+", expected one of "+Utilities.toString(expected), Utilities.existsInList(actual, expected)); assertTrue(Utilities.existsInList(actual, expected), "Actual = "+actual+", expected one of "+Utilities.toString(expected));
XhtmlNode node = new XhtmlNode(NodeType.Element, "p"); XhtmlNode node = new XhtmlNode(NodeType.Element, "p");
new DataRenderer(rc).render(node, dt); new DataRenderer(rc).render(node, dt);
actual = new XhtmlComposer(true, false).compose(node); actual = new XhtmlComposer(true, false).compose(node);
Assert.assertTrue(actual.startsWith("<p>")); assertTrue(actual.startsWith("<p>"));
Assert.assertTrue(actual.endsWith("</p>")); assertTrue(actual.endsWith("</p>"));
Assert.assertTrue("Actual = "+actual+", expected one of "+Utilities.toString(expected), Utilities.existsInList(actual.substring(0, actual.length()-4).substring(3), expected)); assertTrue(Utilities.existsInList(actual.substring(0, actual.length()-4).substring(3), expected), "Actual = "+actual+", expected one of "+Utilities.toString(expected));
} }
@Test @Test

View File

@ -20,7 +20,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-base</artifactId> <artifactId>hapi-fhir-base</artifactId>
<exclusions> <exclusions>
<exclusion> <exclusion>
@ -146,6 +146,16 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>com.atlassian.commonmark</groupId>
<artifactId>commonmark</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.atlassian.commonmark</groupId>
<artifactId>commonmark-ext-gfm-tables</artifactId>
<scope>test</scope>
</dependency>
<!-- JUnit Jupiter --> <!-- JUnit Jupiter -->
<dependency> <dependency>
@ -160,16 +170,6 @@
<version>${junit_jupiter_version}</version> <version>${junit_jupiter_version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>com.atlassian.commonmark</groupId>
<artifactId>commonmark</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.atlassian.commonmark</groupId>
<artifactId>commonmark-ext-gfm-tables</artifactId>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>
@ -192,4 +192,4 @@
</resources> </resources>
</build> </build>
</project> </project>

View File

@ -28,6 +28,7 @@ import org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager;
import org.hl7.fhir.utilities.npm.NpmPackage; import org.hl7.fhir.utilities.npm.NpmPackage;
import org.hl7.fhir.utilities.npm.ToolsVersion; import org.hl7.fhir.utilities.npm.ToolsVersion;
import org.hl7.fhir.utilities.tests.BaseTestingUtilities; import org.hl7.fhir.utilities.tests.BaseTestingUtilities;
import org.hl7.fhir.utilities.tests.TestConfig;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NamedNodeMap;
@ -125,14 +126,18 @@ public class TestingUtilities extends BaseTestingUtilities {
} }
} }
public static String getTerminologyCacheDirectory() {
return TestConfig.getInstance().getTxCacheDirectory("org.hl7.fhir.r5");
}
public static SimpleWorkerContext getWorkerContext(NpmPackage npmPackage) throws Exception { public static SimpleWorkerContext getWorkerContext(NpmPackage npmPackage) throws Exception {
SimpleWorkerContext swc = new SimpleWorkerContext.SimpleWorkerContextBuilder().withAllowLoadingDuplicates(true).withUserAgent(TestConstants.USER_AGENT).withTerminologyCachePath(TestConstants.TX_CACHE).fromPackage(npmPackage); SimpleWorkerContext swc = new SimpleWorkerContext.SimpleWorkerContextBuilder().withAllowLoadingDuplicates(true).withUserAgent(TestConstants.USER_AGENT).withTerminologyCachePath(getTerminologyCacheDirectory()).fromPackage(npmPackage);
TerminologyCache.setCacheErrors(true); TerminologyCache.setCacheErrors(true);
return swc; return swc;
} }
public static SimpleWorkerContext getWorkerContext(NpmPackage npmPackage, IWorkerContext.IContextResourceLoader loader) throws Exception { public static SimpleWorkerContext getWorkerContext(NpmPackage npmPackage, IWorkerContext.IContextResourceLoader loader) throws Exception {
SimpleWorkerContext swc = new SimpleWorkerContext.SimpleWorkerContextBuilder().withAllowLoadingDuplicates(true).withUserAgent(TestConstants.USER_AGENT).withTerminologyCachePath(TestConstants.TX_CACHE).fromPackage(npmPackage, loader); SimpleWorkerContext swc = new SimpleWorkerContext.SimpleWorkerContextBuilder().withAllowLoadingDuplicates(true).withUserAgent(TestConstants.USER_AGENT).withTerminologyCachePath(getTerminologyCacheDirectory()).fromPackage(npmPackage, loader);
TerminologyCache.setCacheErrors(true); TerminologyCache.setCacheErrors(true);
return swc; return swc;
} }

View File

@ -7,10 +7,10 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -19,6 +19,7 @@ import java.util.stream.Collectors;
import java.util.stream.IntStream; import java.util.stream.IntStream;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.apache.commons.io.IOUtils;
import org.hl7.fhir.r5.formats.IParser; import org.hl7.fhir.r5.formats.IParser;
import org.hl7.fhir.r5.model.CanonicalResource; import org.hl7.fhir.r5.model.CanonicalResource;
import org.hl7.fhir.r5.model.CapabilityStatement; import org.hl7.fhir.r5.model.CapabilityStatement;
@ -27,6 +28,7 @@ import org.hl7.fhir.r5.model.Coding;
import org.hl7.fhir.r5.model.TerminologyCapabilities; import org.hl7.fhir.r5.model.TerminologyCapabilities;
import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.model.ValueSet;
import org.hl7.fhir.r5.terminologies.ValueSetExpander; import org.hl7.fhir.r5.terminologies.ValueSetExpander;
import org.hl7.fhir.utilities.tests.ResourceLoaderTests;
import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
@ -36,7 +38,7 @@ import org.junit.jupiter.params.provider.MethodSource;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonParser; import com.google.gson.JsonParser;
public class TerminologyCacheTests { public class TerminologyCacheTests implements ResourceLoaderTests {
static final ValueSet.ConceptSetComponent include = new ValueSet.ConceptSetComponent(); static final ValueSet.ConceptSetComponent include = new ValueSet.ConceptSetComponent();
static { static {
@ -59,8 +61,9 @@ public class TerminologyCacheTests {
private JsonParser jsonParser = new JsonParser(); private JsonParser jsonParser = new JsonParser();
private JsonElement getJsonFromFile(String filename) throws URISyntaxException, IOException { private JsonElement getJsonFromFile(String filename) throws URISyntaxException, IOException {
final Path path = Paths.get("src","test","resources", "context", filename); InputStream inputStream = getResourceAsInputStream("context", filename);
final String stringValue = new String ( Files.readAllBytes(path));
final String stringValue = IOUtils.toString(inputStream, java.nio.charset.StandardCharsets.UTF_8);
return jsonParser.parse(stringValue); return jsonParser.parse(stringValue);
}; };

View File

@ -2,11 +2,11 @@ package org.hl7.fhir.r5.test.utils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.hl7.fhir.utilities.tests.ResourceLoaderTests;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.MethodSource;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.file.Path; import java.nio.file.Path;
@ -16,16 +16,15 @@ import java.util.stream.Stream;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertNull;
public class CompareUtilitiesTest { public class CompareUtilitiesTests implements ResourceLoaderTests {
public static final Path ROOT_TEST_PATH = Paths.get("src","test","resources", "testUtilities");
public static final Path ROOT_TEST_PATH = Paths.get("testUtilities");
public static final Path ROOT_XML_TEST_PATH = ROOT_TEST_PATH.resolve("xml"); public static final Path ROOT_XML_TEST_PATH = ROOT_TEST_PATH.resolve("xml");
public static final Path ROOT_JSON_TEST_PATH = ROOT_TEST_PATH.resolve("json"); public static final Path ROOT_JSON_TEST_PATH = ROOT_TEST_PATH.resolve("json");
public String getResourceAsString(String path) throws IOException { public String getResourceAsString(String path) throws IOException {
InputStream inputStream = new FileInputStream(path); InputStream inputStream = getResourceAsInputStream(path);
String contents = IOUtils.toString(inputStream, java.nio.charset.StandardCharsets.UTF_8); String contents = IOUtils.toString(inputStream, java.nio.charset.StandardCharsets.UTF_8);
return contents.trim(); return contents.trim();
} }
@ -52,15 +51,20 @@ public class CompareUtilitiesTest {
@ParameterizedTest @ParameterizedTest
@MethodSource("getCompareXMLParams") @MethodSource("getCompareXMLParams")
public void testCompareXML(String expectedFileName, String actualFileName, String expectedOutputFileName) throws Exception { public void testCompareXML(String expectedFileName, String actualFileName, String expectedOutputFileName) throws Exception {
final String expectedXMLPath = ROOT_XML_TEST_PATH.resolve(expectedFileName).toAbsolutePath().toString(); final String expectedXMLPath = ROOT_XML_TEST_PATH.resolve(expectedFileName).toString();
final String actualXMLPath = ROOT_XML_TEST_PATH.resolve(actualFileName).toAbsolutePath().toString(); final String actualXMLPath = ROOT_XML_TEST_PATH.resolve(actualFileName).toString();
final String actualOutput = CompareUtilities.checkXMLIsSame(expectedXMLPath, actualXMLPath); ClassLoader classLoader = CompareUtilitiesTests.class.getClassLoader();
InputStream expectedXMLStream = classLoader.getResourceAsStream(expectedXMLPath);
InputStream actualXMLStream = classLoader.getResourceAsStream(actualXMLPath);
final String actualOutput = CompareUtilities.checkXMLIsSame(expectedXMLStream, actualXMLStream);
if (expectedOutputFileName == null) { if (expectedOutputFileName == null) {
assertNull(actualOutput); assertNull(actualOutput);
} else { } else {
final String expectedOutputPath = ROOT_XML_TEST_PATH.resolve(expectedOutputFileName).toAbsolutePath().toString(); final String expectedOutputPath = ROOT_XML_TEST_PATH.resolve(expectedOutputFileName).toString();
String expectedOutput = normalizeNewlines(getResourceAsString(expectedOutputPath)); String expectedOutput = normalizeNewlines(getResourceAsString(expectedOutputPath));
assertEquals(expectedOutput, normalizeNewlines(actualOutput)); assertEquals(expectedOutput, normalizeNewlines(actualOutput));
} }
@ -84,14 +88,14 @@ public class CompareUtilitiesTest {
@ParameterizedTest @ParameterizedTest
@MethodSource("getCompareJSONParams") @MethodSource("getCompareJSONParams")
public void testCompareJSON(String expectedFileName, String actualFileName, String expectedOutputFileName) throws IOException { public void testCompareJSON(String expectedFileName, String actualFileName, String expectedOutputFileName) throws IOException {
final String expectedJSONPath = ROOT_JSON_TEST_PATH.resolve(expectedFileName).toAbsolutePath().toString(); final String expectedJSONPath = ROOT_JSON_TEST_PATH.resolve(expectedFileName).toString();
final String actualJSONPath = ROOT_JSON_TEST_PATH.resolve(actualFileName).toAbsolutePath().toString(); final String actualJSONPath = ROOT_JSON_TEST_PATH.resolve(actualFileName).toString();
final String actualOutput = CompareUtilities.checkJsonSrcIsSame(getResourceAsString(expectedJSONPath), getResourceAsString(actualJSONPath), false); final String actualOutput = CompareUtilities.checkJsonSrcIsSame(getResourceAsString(expectedJSONPath), getResourceAsString(actualJSONPath), false);
if (expectedOutputFileName == null) { if (expectedOutputFileName == null) {
assertNull(actualOutput); assertNull(actualOutput);
} else { } else {
final String expectedOutputPath = ROOT_JSON_TEST_PATH.resolve(expectedOutputFileName).toAbsolutePath().toString(); final String expectedOutputPath = ROOT_JSON_TEST_PATH.resolve(expectedOutputFileName).toString();
String expectedOutput = normalizeNewlines(getResourceAsString(expectedOutputPath)); String expectedOutput = normalizeNewlines(getResourceAsString(expectedOutputPath));
assertEquals(expectedOutput, normalizeNewlines(actualOutput)); assertEquals(expectedOutput, normalizeNewlines(actualOutput));
} }

View File

@ -1,45 +0,0 @@
-------------------------------------------------------------------------------------
{"hierarchical" : false, "valueSet" :{
"resourceType" : "ValueSet",
"compose" : {
"include" : [{
"system" : "http://loinc.org",
"concept" : [{
"extension" : [{
"url" : "http://hl7.org/fhir/StructureDefinition/valueset-label",
"valueString" : "A."
}],
"code" : "LA20752-4",
"display" : "Within 24 hours"
},
{
"extension" : [{
"url" : "http://hl7.org/fhir/StructureDefinition/valueset-label",
"valueString" : "B."
}],
"code" : "LA20753-2",
"display" : "After 24 hours but before 3 days"
},
{
"extension" : [{
"url" : "http://hl7.org/fhir/StructureDefinition/valueset-label",
"valueString" : "C."
}],
"code" : "LA20754-0",
"display" : "Three days or later"
},
{
"extension" : [{
"url" : "http://hl7.org/fhir/StructureDefinition/valueset-label",
"valueString" : "D."
}],
"code" : "LA4489-6",
"display" : "Unknown"
}]
}]
}
}}####
e: {
"error" : "Cannot invoke \"org.hl7.fhir.r5.terminologies.TerminologyClient.expandValueset(org.hl7.fhir.r5.model.ValueSet, org.hl7.fhir.r5.model.Parameters, java.util.Map)\" because \"this.txClient\" is null"
}
-------------------------------------------------------------------------------------

View File

@ -84,22 +84,60 @@
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId> <artifactId>junit-jupiter-api</artifactId>
<version>${junit_jupiter_version}</version> <scope>provided</scope>
<scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>${byte_buddy_version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit_jupiter_version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${junit_jupiter_version}</version>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId> <artifactId>junit-jupiter-params</artifactId>
<version>${junit_jupiter_version}</version> <version>${junit_jupiter_version}</version>
<scope>test</scope> <scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>${junit_platform_launcher_version}</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.hl7.fhir.testcases</groupId> <groupId>org.hl7.fhir.testcases</groupId>
<artifactId>fhir-test-cases</artifactId> <artifactId>fhir-test-cases</artifactId>
<version>${validator_test_case_version}</version> <version>${validator_test_case_version}</version>
<scope>test</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>provided</scope>
</dependency>
<!-- <!--
<dependency> <dependency>
<groupId>com.squareup.okhttp3</groupId> <groupId>com.squareup.okhttp3</groupId>

View File

@ -7,13 +7,12 @@ import org.hl7.fhir.utilities.ToolGlobalSettings;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import java.io.*; import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class BaseTestingUtilities { public class BaseTestingUtilities {
static public boolean silent; static public boolean silent;
public static String loadTestResource(String... paths) throws IOException { public static String loadTestResource(String... paths) throws IOException {
/** /**
* This 'if' condition checks to see if the fhir-test-cases project (https://github.com/FHIR/fhir-test-cases) is * This 'if' condition checks to see if the fhir-test-cases project (https://github.com/FHIR/fhir-test-cases) is
@ -24,7 +23,7 @@ public class BaseTestingUtilities {
* at the same directory level as the core project. * at the same directory level as the core project.
*/ */
String dir = System.getenv("FHIR-TEST-CASES"); String dir = TestConfig.getInstance().getFhirTestCasesDirectory();
if (dir == null && ToolGlobalSettings.hasTestsPath()) { if (dir == null && ToolGlobalSettings.hasTestsPath()) {
dir = ToolGlobalSettings.getTestsPath(); dir = ToolGlobalSettings.getTestsPath();
} }
@ -48,7 +47,7 @@ public class BaseTestingUtilities {
public static InputStream loadTestResourceStream(String... paths) throws IOException { public static InputStream loadTestResourceStream(String... paths) throws IOException {
String dir = System.getenv("FHIR-TEST-CASES"); String dir = TestConfig.getInstance().getFhirTestCasesDirectory();
if (dir == null && ToolGlobalSettings.hasTestsPath()) { if (dir == null && ToolGlobalSettings.hasTestsPath()) {
dir = ToolGlobalSettings.getTestsPath(); dir = ToolGlobalSettings.getTestsPath();
} }
@ -66,7 +65,7 @@ public class BaseTestingUtilities {
} }
public static byte[] loadTestResourceBytes(String... paths) throws IOException { public static byte[] loadTestResourceBytes(String... paths) throws IOException {
String dir = System.getenv("FHIR-TEST-CASES"); String dir = TestConfig.getInstance().getFhirTestCasesDirectory();
if (dir == null && ToolGlobalSettings.hasTestsPath()) { if (dir == null && ToolGlobalSettings.hasTestsPath()) {
dir = ToolGlobalSettings.getTestsPath(); dir = ToolGlobalSettings.getTestsPath();
} }
@ -84,7 +83,7 @@ public class BaseTestingUtilities {
} }
public static boolean findTestResource(String... paths) throws IOException { public static boolean findTestResource(String... paths) throws IOException {
String dir = System.getenv("FHIR-TEST-CASES"); String dir = TestConfig.getInstance().getFhirTestCasesDirectory();
if (dir == null && ToolGlobalSettings.hasTestsPath()) { if (dir == null && ToolGlobalSettings.hasTestsPath()) {
dir = ToolGlobalSettings.getTestsPath(); dir = ToolGlobalSettings.getTestsPath();
} }
@ -112,4 +111,7 @@ public class BaseTestingUtilities {
Utilities.createDirectory(path); Utilities.createDirectory(path);
return path; return path;
} }
public static void setFhirTestCasesDirectory(String s) {
}
} }

View File

@ -8,16 +8,12 @@ import java.util.List;
public class CacheVerificationLogger implements ToolingClientLogger { public class CacheVerificationLogger implements ToolingClientLogger {
public static final String FHIR_TXCACHE_REBUILD = "fhir.txcache.rebuild";
public static final String isRebuildingCache = System.getProperty(FHIR_TXCACHE_REBUILD);
@Getter @Getter
int requests = 0; int requests = 0;
@Override @Override
public void logRequest(String method, String url, List<String> headers, byte[] body) { public void logRequest(String method, String url, List<String> headers, byte[] body) {
if (!isRebuildingCache()) { if (!TestConfig.getInstance().isRebuildCache()) {
System.err.println("Unexpected request to server"); System.err.println("Unexpected request to server");
System.err.println(method); System.err.println(method);
System.err.println(url); System.err.println(url);
@ -48,18 +44,15 @@ public class CacheVerificationLogger implements ToolingClientLogger {
} }
private boolean isRebuildingCache() {
return isRebuildingCache != null && "TRUE".equals(isRebuildingCache.toUpperCase());
}
public boolean verifyHasNoRequests() { public boolean verifyHasNoRequests() {
if (TestConfig.getInstance().isRebuildCache()) {
if (isRebuildingCache()) {
return true; return true;
} else { } else {
if (requests != 0) { if (requests != 0) {
System.err.println(requests + " unexpected TX server requests logged. If a new test has been added, you may need to " + System.err.println(requests + " unexpected TX server requests logged. If a new test has been added, you may need to " +
"rebuild the TX Cache for the test using the 'mvn test -D" + FHIR_TXCACHE_REBUILD + "=true' option"); "rebuild the TX Cache for the test using the 'mvn test -D" + TestConfig.FHIR_TXCACHE_REBUILD + "=true' option");
return false; return false;
} else { } else {
return true; return true;

View File

@ -0,0 +1,34 @@
package org.hl7.fhir.utilities.tests;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
public interface ResourceLoaderTests {
static final String PATH_DELIMITER = "/";
public static InputStream getResourceAsInputStream(Class<?> clazz, String... resourcePath) {
return clazz.getClassLoader().getResourceAsStream(String.join(PATH_DELIMITER, resourcePath));
}
public default InputStream getResourceAsInputStream(String ... resourcePath) {
return getResourceAsInputStream(this.getClass(), resourcePath);
}
public default void copyResourceToFile(Path target, String ... resourcePath) throws IOException {
copyResourceToFile(this.getClass(), target, resourcePath);
}
public static void copyResourceToFile(Class<?> clazz, Path target, String ... resourcePath) throws IOException {
InputStream initialStream = getResourceAsInputStream(clazz, resourcePath);
java.nio.file.Files.copy(
initialStream,
target,
StandardCopyOption.REPLACE_EXISTING);
initialStream.close();
}
}

View File

@ -0,0 +1,32 @@
package org.hl7.fhir.utilities.tests;
import lombok.Getter;
import lombok.Setter;
import java.nio.file.Paths;
public class TestConfig {
private static final TestConfig INSTANCE = new TestConfig();
public static final String FHIR_TXCACHE_REBUILD = "fhir.txcache.rebuild";
public static final String FHIR_TEST_CASES = "FHIR-TEST-CASES";
@Getter @Setter
private boolean rebuildCache = System.getProperty(FHIR_TXCACHE_REBUILD) != null && "TRUE".equals(System.getProperty(FHIR_TXCACHE_REBUILD));
@Getter @Setter
private String txCacheDirectory = TestConstants.TX_CACHE;
@Getter @Setter
private String fhirTestCasesDirectory = System.getenv(FHIR_TEST_CASES);
public static TestConfig getInstance() {
return INSTANCE;
}
public String getTxCacheDirectory(String ... path) {
return Paths.get(txCacheDirectory, path).toString();
}
}

View File

@ -1,8 +1,10 @@
package org.hl7.fhir.validation.tests.utilities; package org.hl7.fhir.utilities.tests;
import java.nio.file.Paths; import java.nio.file.Paths;
public class TestConstants { public class TestConstants {
public static final java.lang.String TX_CACHE = Paths.get("src","test","resources", "txCache").toAbsolutePath().toString(); public static final java.lang.String TX_CACHE = Paths.get("src","test","resources", "txCache").toAbsolutePath().toString();
public static final java.lang.String TX_CACHE_LOG = Paths.get(System.getProperty("user.dir"), "tx.log.html").toAbsolutePath().toString(); public static final java.lang.String TX_CACHE_LOG = Paths.get(System.getProperty("user.dir"), "tx.log.html").toAbsolutePath().toString();

View File

@ -0,0 +1,6 @@
package org.hl7.fhir.utilities.tests.execution;
public interface CliTestException {
String getTestId();
Throwable getException();
}

View File

@ -0,0 +1,13 @@
package org.hl7.fhir.utilities.tests.execution;
import java.util.List;
public interface CliTestSummary {
long getTestsFoundCount();
long getTestsFailedCount();
long getTestsAbortedCount();
long getTestsSkippedCount();
List<CliTestException> getExceptions();
}

View File

@ -0,0 +1,56 @@
package org.hl7.fhir.utilities.tests.execution;
import org.hl7.fhir.utilities.tests.execution.junit5.JUnit5ModuleTestExecutor;
import java.io.PrintStream;
public abstract class ModuleTestExecutor {
private static final String FAILURE_SUMMARY_TEMPLATE = "Test failures for module %s (%d):";
private static final String STARTING_TEST_TEMPLATE = "Starting: %s";
private static final String FINISHED_TEST_TEMPLATE = "Finished: %s with result: %s";
private static final String FAILED_TEST_TEMPLATE = "Failed Test ID: %s";
/**
* Utility method to print the summary of execution in human-readable
* format.
*
* Any test failures are listed using the same unique IDs output in
* the {@link JUnit5ModuleTestExecutor#executeTests(PrintStream, String)}
* method.
*
* @param out the PrintStream to log summary data to.
* @param testExecutionSummary the test summary
* @param moduleName the module name
*/
public static void printSummmary(PrintStream out, CliTestSummary testExecutionSummary, String moduleName) {
if (testExecutionSummary.getTestsFailedCount() > 0) {
out.println("\n" + String.format(FAILURE_SUMMARY_TEMPLATE, moduleName, testExecutionSummary.getTestsFailedCount()));
for (CliTestException failure : testExecutionSummary.getExceptions()) {
out.println("\t" + failure.getTestId() + ": " + failure.getException().getMessage());
}
out.println();
}
}
public static void printTestStarted(PrintStream out, String displayName) {
out.println(String.format(STARTING_TEST_TEMPLATE, displayName));
}
public static void printTestFailed(PrintStream out, String uniqueIdentifier, Throwable throwable) {
out.println(String.format(FAILED_TEST_TEMPLATE, uniqueIdentifier));
if (throwable != null) {
throwable.printStackTrace(System.out);
}
}
public static void printTestFinished(PrintStream out, String displayName, String status) {
out.println(String.format(FINISHED_TEST_TEMPLATE, displayName, status));
}
public abstract String getModuleName();
public abstract CliTestSummary executeTests(PrintStream out, String classNameFilter);
}

View File

@ -0,0 +1,22 @@
package org.hl7.fhir.utilities.tests.execution.junit4;
import org.hl7.fhir.utilities.tests.execution.CliTestException;
import org.junit.runner.notification.Failure;
public class JUnit4TestException implements CliTestException {
private final Failure failure;
public JUnit4TestException(Failure failure) {
this.failure = failure;
}
@Override
public String getTestId() {
return failure.getDescription().getClassName() + failure.getDescription().getMethodName() + failure.getDescription().getDisplayName();
}
@Override
public Throwable getException() {
return failure.getException();
}
}

View File

@ -0,0 +1,83 @@
package org.hl7.fhir.utilities.tests.execution.junit4;
import lombok.Getter;
import org.hl7.fhir.utilities.tests.execution.CliTestSummary;
import org.hl7.fhir.utilities.tests.execution.ModuleTestExecutor;
import org.junit.runner.Description;
import org.junit.runner.JUnitCore;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class JUnit4TestExecutor extends ModuleTestExecutor {
@Getter
private final String moduleName;
private final List<String> classNames;
public JUnit4TestExecutor(String moduleName, List<String> classNames) {
this.moduleName = moduleName + " (JUnit4)";
this.classNames = Collections.unmodifiableList(new ArrayList<>(classNames));
}
private class JUnit4RunListener extends RunListener {
PrintStream writer;
public JUnit4RunListener(PrintStream writer) {
this.writer = writer;
}
@Override
public void testStarted(Description description) {
ModuleTestExecutor.printTestStarted(writer, description.getDisplayName());
}
@Override
public void testFinished(Description description) {
ModuleTestExecutor.printTestFinished(writer, description.getDisplayName(),
"FINISHED");
}
@Override
public void testFailure(Failure failure) {
ModuleTestExecutor.printTestFailed(writer,
failure.getDescription().getDisplayName(),
failure.getException()
);
}
}
public CliTestSummary executeTests(PrintStream out, String classNameFilter) {
JUnitCore junit = new JUnitCore();
junit.addListener(new JUnit4RunListener(System.out));
Pattern pattern = classNameFilter != null ? Pattern.compile(classNameFilter) : null;
List<Class<?>> classes = classNames.stream()
.filter(className -> pattern == null ? true : pattern.matcher(className).matches())
.map(className -> {
try {
return Class.forName(className);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.toList());
Class<?>[] classArray = new Class[classes.size()];
classes.toArray(classArray);
org.junit.runner.Result result = junit.run(classArray);
return new JUnit4TestSummaryAdapter(result);
}
}

View File

@ -0,0 +1,41 @@
package org.hl7.fhir.utilities.tests.execution.junit4;
import org.hl7.fhir.utilities.tests.execution.CliTestException;
import org.hl7.fhir.utilities.tests.execution.CliTestSummary;
import org.junit.runner.Result;
import java.util.List;
import java.util.stream.Collectors;
public class JUnit4TestSummaryAdapter implements CliTestSummary {
private final Result result;
public JUnit4TestSummaryAdapter(Result result) {
this.result = result;
}
@Override
public long getTestsFoundCount() {
return result.getRunCount();
}
@Override
public long getTestsFailedCount() {
return result.getFailureCount();
}
@Override
public long getTestsAbortedCount() {
return 0;
}
@Override
public long getTestsSkippedCount() {
return 0;
}
@Override
public List<CliTestException> getExceptions() {
return result.getFailures().stream().map(ex -> new JUnit4TestException(ex)).collect(Collectors.toList());
}
}

View File

@ -0,0 +1,145 @@
package org.hl7.fhir.utilities.tests.execution.junit5;
import lombok.Getter;
import lombok.Setter;
import org.hl7.fhir.utilities.tests.execution.CliTestSummary;
import org.hl7.fhir.utilities.tests.execution.ModuleTestExecutor;
import org.junit.platform.engine.TestExecutionResult;
import org.junit.platform.launcher.*;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;
import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
import org.junit.platform.launcher.listeners.TestExecutionSummary;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import static org.junit.platform.engine.discovery.ClassNameFilter.includeClassNamePatterns;
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectPackage;
/**
* This class allows JUnit 5 tests to be run in Java runtime.
*
* JUnit 4 tests ARE NOT SUPPORTED.
*
* This mimics for the most part the output of the Maven Surefire plugin, with
* additional summaries and unique IDs for diagnosing failing tests.
*/
public class JUnit5ModuleTestExecutor extends ModuleTestExecutor {
private static final String SUMMARY_TEMPLATE = "Tests run: %d, Failures: %d, Errors: %d, Skipped: %d";
private static final String MODULE_FINISHED_TEMPLATE = "%s module tests finished.";
public static final String DEFAULT_CLASSNAME_FILTER = org.junit.platform.engine.discovery.ClassNameFilter.STANDARD_INCLUDE_PATTERN;
@Getter
private final String moduleName;
@Getter
private final List<String> packageNames;
public JUnit5ModuleTestExecutor(String moduleName, List<String> packageNames) {
this.moduleName = moduleName;
this.packageNames = Collections.unmodifiableList(packageNames);
}
private List<org.junit.platform.engine.discovery.PackageSelector> getPackageSelectors() {
final List<String> packageNames = getPackageNames();
return packageNames.stream().map(it -> selectPackage(it)).collect(Collectors.toList());
}
class ModuleTestExecutionListener extends SummaryGeneratingListener {
@Setter
private PrintStream out;
@Override
public void executionStarted(TestIdentifier testIdentifier) {
ModuleTestExecutor.printTestStarted(out, testIdentifier.getDisplayName());
super.executionStarted(testIdentifier);
}
@Override
public void executionFinished(TestIdentifier testIdentifier, TestExecutionResult testExecutionResult) {
//
if (testExecutionResult.getStatus().equals(TestExecutionResult.Status.FAILED)) {
ModuleTestExecutor.printTestFailed(out, testIdentifier.getUniqueId(), testExecutionResult.getThrowable().isPresent()
? testExecutionResult.getThrowable().get()
:null);
}
ModuleTestExecutor.printTestFinished(out,
testIdentifier.getDisplayName(),
testExecutionResult.getStatus().name()
);
super.executionFinished(testIdentifier, testExecutionResult);
}
}
/**
* Execute all tests defined in this module and return a TestExecutionSummary.
*
* Any stack traces required to diagnose test failures will be output at this
* stage, along with a unique test ID.
*
* @param out the PrintStream to log execution or test failure.
* @param classNameFilter a Regex to use to select tests. If null, this will
* default to the JUnit console filter.
* @return The test execution summary.
*
* @see org.junit.platform.engine.discovery.ClassNameFilter
*/
public CliTestSummary executeTests(PrintStream out, String classNameFilter) {
LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
.selectors(
getPackageSelectors()
)
.filters(
includeClassNamePatterns(classNameFilter == null ? DEFAULT_CLASSNAME_FILTER : classNameFilter)
)
.build();
ModuleTestExecutionListener moduleTestExecutionlistener = new ModuleTestExecutionListener();
moduleTestExecutionlistener.setOut(out);
try (LauncherSession session = LauncherFactory.openSession()) {
Launcher launcher = session.getLauncher();
launcher.registerTestExecutionListeners(moduleTestExecutionlistener);
TestPlan testPlan = launcher.discover(request);
// Execute test plan
launcher.execute(testPlan);
// Alternatively, execute the request directly
// launcher.execute(request);
}
TestExecutionSummary summary = moduleTestExecutionlistener.getSummary();
out.println("\n" + String.format(MODULE_FINISHED_TEMPLATE, getModuleName()));
out.println(String.format(SUMMARY_TEMPLATE, summary.getTestsFoundCount(), summary.getTestsFailedCount(), summary.getTestsAbortedCount(), summary.getTestsSkippedCount()));
return new JUnit5TestSummaryAdapter(summary);
}
/**
* Create a ModuleTestExecutor for the standard case where the module name
* maps to the package name of the root package containing tests.
*
* For example the module "org.hl7.fhir.r5" will be assumed to have all its
* tests in the "org.hl7.fhir.r5" package or its child packages.
*
* @param moduleName The name of the module and root package containing tests.
* @return the ModuleTestExecutor for the module
*/
public static JUnit5ModuleTestExecutor getStandardModuleTestExecutor(String moduleName) {
return new JUnit5ModuleTestExecutor(moduleName, Arrays.asList(moduleName));
}
}

View File

@ -0,0 +1,22 @@
package org.hl7.fhir.utilities.tests.execution.junit5;
import org.hl7.fhir.utilities.tests.execution.CliTestException;
import org.junit.platform.launcher.listeners.TestExecutionSummary;
public class JUnit5TestException implements CliTestException {
private final TestExecutionSummary.Failure ex;
public JUnit5TestException(TestExecutionSummary.Failure ex) {
this.ex = ex;
}
@Override
public String getTestId() {
return ex.getTestIdentifier().getUniqueId();
}
@Override
public Throwable getException() {
return ex.getException();
}
}

View File

@ -0,0 +1,43 @@
package org.hl7.fhir.utilities.tests.execution.junit5;
import org.hl7.fhir.utilities.tests.execution.CliTestException;
import org.hl7.fhir.utilities.tests.execution.CliTestSummary;
import org.junit.platform.launcher.listeners.TestExecutionSummary;
import java.util.List;
import java.util.stream.Collectors;
public class JUnit5TestSummaryAdapter implements CliTestSummary {
final TestExecutionSummary testExecutionSummary;
public JUnit5TestSummaryAdapter( TestExecutionSummary testExecutionSummary) {
this.testExecutionSummary = testExecutionSummary;
}
@Override
public long getTestsFoundCount() {
return testExecutionSummary.getTestsFoundCount();
}
@Override
public long getTestsFailedCount() {
return testExecutionSummary.getTestsFailedCount();
}
@Override
public long getTestsAbortedCount() {
return testExecutionSummary.getTestsAbortedCount();
}
@Override
public long getTestsSkippedCount() {
return testExecutionSummary.getTestsSkippedCount();
}
@Override
public List<CliTestException> getExceptions() {
return testExecutionSummary.getFailures().stream().map(ex -> new JUnit5TestException(ex)).collect(Collectors.toList());
}
}

View File

@ -2,15 +2,20 @@ package org.hl7.fhir.utilities.npm;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import org.hl7.fhir.utilities.tests.ResourceLoaderTests;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
public class PackageClientTest { public class PackageClientTest implements ResourceLoaderTests {
PackageClient packageClient = new PackageClient(PackageClient.PRIMARY_SERVER); PackageClient packageClient = new PackageClient(PackageClient.PRIMARY_SERVER);
@ -26,8 +31,8 @@ public class PackageClientTest {
@Test @Test
@DisplayName("test getting package from JSON works") @DisplayName("test getting package from JSON works")
public void getPackageInfoFromJSONTest() throws java.io.IOException{ public void getPackageInfoFromJSONTest() throws java.io.IOException, URISyntaxException {
final JsonObject jsonObject = new Gson().fromJson(Files.newBufferedReader(Paths.get("src", "test", "resources", "npm", "PackageClient-baseTestCase.json")), JsonObject.class); final JsonObject jsonObject = new Gson().fromJson(new InputStreamReader(getResourceAsInputStream("npm","PackageClient-baseTestCase.json")), JsonObject.class);
final PackageInfo packageInfo = packageClient.getPackageInfoFromJSON(jsonObject, null, null, null); final PackageInfo packageInfo = packageClient.getPackageInfoFromJSON(jsonObject, null, null, null);
assertExpectedFields(packageInfo); assertExpectedFields(packageInfo);
@ -36,7 +41,7 @@ public class PackageClientTest {
@Test @Test
@DisplayName("test getting package from JSON works") @DisplayName("test getting package from JSON works")
public void getPackageInfoWithIdFromJSONTest() throws java.io.IOException { public void getPackageInfoWithIdFromJSONTest() throws java.io.IOException {
final JsonObject jsonObject = new Gson().fromJson(Files.newBufferedReader(Paths.get("src", "test", "resources", "npm", "PackageClient-testCaseWithId.json")), JsonObject.class); final JsonObject jsonObject = new Gson().fromJson(new InputStreamReader(getResourceAsInputStream("npm", "PackageClient-testCaseWithId.json")), JsonObject.class);
final PackageInfo packageInfo = packageClient.getPackageInfoFromJSON(jsonObject, null, null, null); final PackageInfo packageInfo = packageClient.getPackageInfoFromJSON(jsonObject, null, null, null);
assertExpectedFields(packageInfo); assertExpectedFields(packageInfo);

View File

@ -1,24 +1,35 @@
package org.hl7.fhir.utilities.tests; package org.hl7.fhir.utilities.tests;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import org.apache.commons.io.IOUtils;
import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.utilities.xls.XLSXmlNormaliser; import org.hl7.fhir.utilities.xls.XLSXmlNormaliser;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
public class XLSXmlNormaliserTests { public class XLSXmlNormaliserTests implements ResourceLoaderTests {
@Test @Test
public void testConvert() throws FHIRException, TransformerException, ParserConfigurationException, SAXException, IOException { public void testConvert() throws FHIRException, TransformerException, ParserConfigurationException, SAXException, IOException {
XLSXmlNormaliser n = new XLSXmlNormaliser("src/test/resources/observation-spreadsheet.xml", "target/observation-spreadsheet.out.xml", true); final String inputFileName = "observation-spreadsheet.xml";
Path inputPath = Paths.get("target", inputFileName);
copyResourceToFile(inputPath, inputFileName);
XLSXmlNormaliser n = new XLSXmlNormaliser(inputPath.toString(), "target/observation-spreadsheet.out.xml", true);
n.go(); n.go();
// n = new XLSXmlNormaliser("C:\\work\\org.hl7.fhir\\build\\source\\observation\\observation-spreadsheet.before.xml", "C:\\\\work\\\\org.hl7.fhir\\\\build\\\\source\\\\observation\\\\observation-spreadsheet.before.out.xml", true);
// n.go();
Assertions.assertTrue(true); Assertions.assertTrue(true);
} }
} }

View File

@ -0,0 +1,9 @@
package org.hl7.fhir.utilities.tests.execution;
import org.junit.Test;
public class DummyJUnit4Test {
@Test
public void myTest() {};
}

View File

@ -0,0 +1,10 @@
package org.hl7.fhir.utilities.tests.execution;
import org.junit.jupiter.api.Test;
public class DummyJUnit5Test {
@Test
public void myTest() {};
}

View File

@ -0,0 +1,44 @@
package org.hl7.fhir.utilities.tests.execution;
import org.hl7.fhir.utilities.tests.execution.junit4.JUnit4TestExecutor;
import org.hl7.fhir.utilities.tests.execution.junit5.JUnit5ModuleTestExecutor;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class ModuleTestExecutorTests {
@Test
public void testJUnit4ModuleTestExecutor() {
ModuleTestExecutor junit4ModuleTestExecutor = new JUnit4TestExecutor("org.hl7.fhir.utilities", Arrays.asList("org.hl7.fhir.utilities.tests.execution.DummyJUnit4Test"));
assertEquals("org.hl7.fhir.utilities (JUnit4)", junit4ModuleTestExecutor.getModuleName());
CliTestSummary cliTestSummary = junit4ModuleTestExecutor.executeTests(System.out, null);
assertEquals(1, cliTestSummary.getTestsFoundCount());
assertEquals(0, cliTestSummary.getExceptions().size());
assertEquals(0, cliTestSummary.getTestsFailedCount());
assertEquals(0, cliTestSummary.getTestsAbortedCount());
assertEquals(0, cliTestSummary.getTestsSkippedCount());
}
@Test
public void testJUnit5ModuleTestExecutor() {
ModuleTestExecutor junit5ModuleTestExecutor = new JUnit5ModuleTestExecutor("org.hl7.fhir.utilities", Arrays.asList("org.hl7.fhir.utilities.tests.execution"));
assertEquals("org.hl7.fhir.utilities", junit5ModuleTestExecutor.getModuleName());
CliTestSummary cliTestSummary = junit5ModuleTestExecutor.executeTests(System.out, ".*DummyJUnit5Test");
assertEquals(1, cliTestSummary.getTestsFoundCount());
assertEquals(0, cliTestSummary.getExceptions().size());
assertEquals(0, cliTestSummary.getTestsFailedCount());
assertEquals(0, cliTestSummary.getTestsAbortedCount());
assertEquals(0, cliTestSummary.getTestsSkippedCount());
}
}

View File

@ -19,6 +19,227 @@
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<!-- JUnit Jupiter -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>${byte_buddy_version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit_jupiter_version}</version>
<scope>compile</scope>
</dependency>
<!-- shoo!
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${junit_jupiter_version}</version>
<scope>compile</scope>
</dependency>
-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit_jupiter_version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>${junit_platform_launcher_version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>compile</scope>
</dependency>
<!-- org.hl7.fhir.core test-jars -->
<!--
These jars contain the test code for running unit tests at runtime.
Any modules that are intended to be run via the validator -run-tests
option need to be included here.
-->
<dependency>
<groupId>org.hl7.fhir.testcases</groupId>
<artifactId>fhir-test-cases</artifactId>
<version>${validator_test_case_version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.utilities</artifactId>
<classifier>tests</classifier>
<type>test-jar</type>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.convertors</artifactId>
<classifier>tests</classifier>
<type>test-jar</type>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.dstu2</artifactId>
<classifier>tests</classifier>
<type>test-jar</type>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.dstu3</artifactId>
<classifier>tests</classifier>
<type>test-jar</type>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.dstu2016may</artifactId>
<classifier>tests</classifier>
<type>test-jar</type>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.r4</artifactId>
<classifier>tests</classifier>
<type>test-jar</type>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.r4b</artifactId>
<classifier>tests</classifier>
<type>test-jar</type>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.r5</artifactId>
<classifier>tests</classifier>
<type>test-jar</type>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.validation</artifactId>
<classifier>tests</classifier>
<type>test-jar</type>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<!-- /org.hl7.fhir.core test-jars -->
<!-- org.hl7.fhir.core test-jar dependencies -->
<!--
If the included org.hl7.fhir.xxx test jars have dependencies, they
will have a <scope>test</scope> entry. This will prevent them from
being included in regular runtime, so we override this with a
duplicate entry below with <scope>compile<scope/>
-->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito_version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>${mockito_version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.atlassian.commonmark</groupId>
<artifactId>commonmark</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.atlassian.commonmark</groupId>
<artifactId>commonmark-ext-gfm-tables</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
<optional>false</optional>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
<optional>false</optional>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.everit.json</groupId>
<artifactId>org.everit.json.schema</artifactId>
<version>1.1.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>mockwebserver</artifactId>
<version>4.9.0</version>
<optional>false</optional>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>ST4</artifactId>
<version>4.1</version>
<optional>false</optional>
<scope>compile</scope>
</dependency>
<!-- /org.hl7.fhir.core test-jar dependencies -->
<!-- <!--
The following dependencies are all listed as optional dependencies in The following dependencies are all listed as optional dependencies in
org.hl7.fhir.utilities (and others) but are required for the CLI to work, org.hl7.fhir.utilities (and others) but are required for the CLI to work,
@ -63,7 +284,7 @@
<plugins> <plugins>
<!-- <!--
Build a fatjar containing all depenedncies Build a fatjar containing all dependencies
--> -->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
@ -94,6 +315,7 @@
<archive> <archive>
<manifest> <manifest>
<addClasspath>true</addClasspath> <addClasspath>true</addClasspath>
<classpathLayoutType>repository</classpathLayoutType>
<mainClass>org.hl7.fhir.validation.ValidatorCli</mainClass> <mainClass>org.hl7.fhir.validation.ValidatorCli</mainClass>
</manifest> </manifest>
</archive> </archive>
@ -180,7 +402,7 @@
<groupId>org.sonatype.plugins</groupId> <groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId> <artifactId>nexus-staging-maven-plugin</artifactId>
<configuration> <configuration>
<skip>true</skip> <skipStaging>true</skipStaging>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>

View File

@ -25,6 +25,24 @@
<artifactId>org.hl7.fhir.utilities</artifactId> <artifactId>org.hl7.fhir.utilities</artifactId>
</dependency> </dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.utilities</artifactId>
<classifier>tests</classifier>
<type>test-jar</type>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.r5</artifactId>
<classifier>tests</classifier>
<type>test-jar</type>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<!-- FHIR Versions --> <!-- FHIR Versions -->
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
@ -46,6 +64,11 @@
<artifactId>org.hl7.fhir.r4</artifactId> <artifactId>org.hl7.fhir.r4</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.r5</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.convertors</artifactId> <artifactId>org.hl7.fhir.convertors</artifactId>
@ -197,7 +220,11 @@
<artifactId>thymeleaf</artifactId> <artifactId>thymeleaf</artifactId>
<version>3.0.9.RELEASE</version> <version>3.0.9.RELEASE</version>
</dependency> </dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
<!-- JUnit Jupiter --> <!-- JUnit Jupiter -->
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
@ -205,12 +232,7 @@
<version>${junit_jupiter_version}</version> <version>${junit_jupiter_version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit_jupiter_version}</version>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>org.junit.vintage</groupId> <groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId> <artifactId>junit-vintage-engine</artifactId>
@ -223,6 +245,28 @@
<optional>true</optional> <optional>true</optional>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit_jupiter_version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit_jupiter_version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>${junit_platform_launcher_version}</version>
<scope>provided</scope>
</dependency>
<!-- End to end --> <!-- End to end -->
<dependency> <dependency>
<groupId>org.seleniumhq.selenium</groupId> <groupId>org.seleniumhq.selenium</groupId>

View File

@ -69,6 +69,8 @@ import org.hl7.fhir.validation.cli.model.CliContext;
import org.hl7.fhir.validation.cli.services.ComparisonService; import org.hl7.fhir.validation.cli.services.ComparisonService;
import org.hl7.fhir.validation.cli.services.ValidationService; import org.hl7.fhir.validation.cli.services.ValidationService;
import org.hl7.fhir.validation.cli.utils.*; import org.hl7.fhir.validation.cli.utils.*;
import org.hl7.fhir.validation.testexecutor.TestExecutor;
import org.hl7.fhir.validation.testexecutor.TestExecutorParams;
import java.io.File; import java.io.File;
import java.net.Authenticator; import java.net.Authenticator;
@ -152,20 +154,36 @@ public class ValidatorCli {
CliContext cliContext = Params.loadCliContext(args); CliContext cliContext = Params.loadCliContext(args);
if (Params.hasParam(args, Params.TEST)) { if (shouldDisplayHelpToUser(args)) {
Common.runValidationEngineTests();
} else if (shouldDisplayHelpToUser(args)) {
Display.displayHelpDetails(); Display.displayHelpDetails();
} else if (Params.hasParam(args, Params.COMPARE)) { } else if (Params.hasParam(args, Params.COMPARE)) {
if (destinationDirectoryValid(Params.getParam(args, Params.DESTINATION))) { if (destinationDirectoryValid(Params.getParam(args, Params.DESTINATION))) {
doLeftRightComparison(args, cliContext, tt); doLeftRightComparison(args, cliContext, tt);
} }
} else { } else if (Params.hasParam(args, Params.TEST)) {
parseTestParamsAndExecute(args);
}
else {
Display.printCliArgumentsAndInfo(args); Display.printCliArgumentsAndInfo(args);
doValidation(tt, tts, cliContext); doValidation(tt, tts, cliContext);
} }
} }
protected static void parseTestParamsAndExecute(String[] args) {
final String testModuleParam = Params.getParam(args, Params.TEST_MODULES);
final String testClassnameFilter = Params.getParam(args, Params.TEST_NAME_FILTER);
final String testCasesDirectory = Params.getParam(args, Params.TEST);
final String txCacheDirectory = Params.getParam(args, Params.TERMINOLOGY_CACHE);
assert TestExecutorParams.isValidModuleParam(testModuleParam) : "Invalid test module param: " + testModuleParam;
final String[] moduleNamesArg = TestExecutorParams.parseModuleParam(testModuleParam);
assert TestExecutorParams.isValidClassnameFilterParam(testClassnameFilter) : "Invalid regex for test classname filter: " + testClassnameFilter;
new TestExecutor(moduleNamesArg).executeTests(testClassnameFilter, txCacheDirectory, testCasesDirectory);
System.exit(0);
}
private static String[] preProcessArgs(String[] args) { private static String[] preProcessArgs(String[] args) {
// ips$branch --> -version 4.0 -ig hl7.fhir.uv.ips#current$connectathon-2 -profile http://hl7.org/fhir/uv/ips/StructureDefinition/Bundle-uv-ips // ips$branch --> -version 4.0 -ig hl7.fhir.uv.ips#current$connectathon-2 -profile http://hl7.org/fhir/uv/ips/StructureDefinition/Bundle-uv-ips
List<String> res = new ArrayList<>(); List<String> res = new ArrayList<>();

View File

@ -66,18 +66,6 @@ public class Common {
return defaultValue; return defaultValue;
} }
/**
* Triggers the validation engine tests to run.
*/
public static void runValidationEngineTests() {
try {
Class<?> clazz = Class.forName("org.hl7.fhir.validation.r5.tests.ValidationEngineTests");
clazz.getMethod("execute").invoke(clazz);
} catch (Exception e) {
e.printStackTrace();
}
}
/** /**
* Default validation engine will point to "http://tx.fhir.org" terminology server. * Default validation engine will point to "http://tx.fhir.org" terminology server.
*/ */

View File

@ -10,5 +10,6 @@ public enum EngineMode {
CONVERT, CONVERT,
SPREADSHEET, SPREADSHEET,
FHIRPATH, FHIRPATH,
VERSION VERSION,
RUN_TESTS
} }

View File

@ -70,6 +70,12 @@ public class Params {
public static final String DO_IMPLICIT_FHIRPATH_STRING_CONVERSION = "-implicit-fhirpath-string-conversions"; public static final String DO_IMPLICIT_FHIRPATH_STRING_CONVERSION = "-implicit-fhirpath-string-conversions";
private static final Object JURISDICTION = "-jurisdiction"; private static final Object JURISDICTION = "-jurisdiction";
public static final String RUN_TESTS = "-run-tests";
public static final String TEST_MODULES = "-test-modules";
public static final String TEST_NAME_FILTER = "-test-classname-filter";
/** /**
* Checks the list of passed in params to see if it contains the passed in param. * Checks the list of passed in params to see if it contains the passed in param.
* *
@ -208,6 +214,9 @@ public class Params {
cliContext.setMode(EngineMode.SPREADSHEET); cliContext.setMode(EngineMode.SPREADSHEET);
} else if (args[i].equals(SNAPSHOT)) { } else if (args[i].equals(SNAPSHOT)) {
cliContext.setMode(EngineMode.SNAPSHOT); cliContext.setMode(EngineMode.SNAPSHOT);
} else if (args[i].equals(RUN_TESTS)) {
// TODO setBaseTestingUtils test directory
cliContext.setMode(EngineMode.RUN_TESTS);
} else if (args[i].equals(SECURITY_CHECKS)) { } else if (args[i].equals(SECURITY_CHECKS)) {
cliContext.setSecurityChecks(true); cliContext.setSecurityChecks(true);
} else if (args[i].equals(CRUMB_TRAIL)) { } else if (args[i].equals(CRUMB_TRAIL)) {

View File

@ -0,0 +1,173 @@
package org.hl7.fhir.validation.testexecutor;
import lombok.Getter;
import org.hl7.fhir.utilities.tests.TestConfig;
import org.hl7.fhir.utilities.tests.execution.CliTestSummary;
import org.hl7.fhir.utilities.tests.execution.junit4.JUnit4TestExecutor;
import org.hl7.fhir.utilities.tests.execution.junit5.JUnit5ModuleTestExecutor;
import org.hl7.fhir.utilities.tests.execution.ModuleTestExecutor;
import javax.annotation.Nonnull;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.hl7.fhir.validation.testexecutor.TestModules.*;
public class TestExecutor {
@Getter private final List<ModuleTestExecutor> jUnit4TestExecutors;
@Getter private final List<ModuleTestExecutor> jUnit5TestExecutors;
public TestExecutor(String[] moduleNamesArg) {
this(getjUnit4TestExecutors(moduleNamesArg), getjUnit5TestExecutors(moduleNamesArg));
}
protected TestExecutor(List<ModuleTestExecutor> jUnit4TestExecutors, List<ModuleTestExecutor> jUnit5TestExecutors) {
this.jUnit4TestExecutors = jUnit4TestExecutors;
this.jUnit5TestExecutors = jUnit5TestExecutors;
}
public static final String TX_CACHE = "txCache";
private static String SUMMARY_TEMPLATE = "Tests run: %d, Failures: %d, Errors: %d, Skipped: %d";
private static final String DOT_PLACEHOLDER = new String(new char[53]).replace("\0", ".");
private static final int MAX_NAME_LENGTH = 50;
private String getModuleResultLine(String moduleName, CliTestSummary moduleTestSummary) {
return getModuleNameAndSpacer(moduleName)
+ " "
+ getModuleResultString(moduleTestSummary);
}
private String getModuleNameAndSpacer(String moduleName) {
return moduleName.length() < MAX_NAME_LENGTH
? moduleName + " " + DOT_PLACEHOLDER.substring(moduleName.length() + 1)
: moduleName.substring(0, MAX_NAME_LENGTH) + "...";
}
private String getModuleResultString(CliTestSummary cliTestSummary) {
if (cliTestSummary.getTestsFoundCount() == 0) {
return "NO TESTS";
}
return cliTestSummary.getTestsFailedCount() == 0 && cliTestSummary.getTestsAbortedCount() == 0
? "PASSED"
: "FAILED";
}
public static boolean pathExistsAsDirectory(String directoryPath) {
Path path = Paths.get(directoryPath);
return Files.exists(path)
&& Files.isDirectory(path);
}
public void executeTests(String classNameFilterArg, String txCacheDirectoryPath, String testCasesDirectoryPath) {
long start = System.currentTimeMillis();
//Our lone JUnit 4 test.
List<ModuleTestExecutor> jUnit4TestExecutors = getJUnit4TestExecutors();
TestConfig.getInstance().setRebuildCache(true);
setUpDirectories(txCacheDirectoryPath, testCasesDirectoryPath);
List<ModuleTestExecutor> jUnit5TestExecutors = getJUnit5TestExecutors();
long testsFoundCount = 0;
long testsFailedCount = 0;
long testsAbortedCount = 0;
long testsSkippedCount = 0;
final Map<String, CliTestSummary> moduleResultMap = new HashMap<>();
final List<ModuleTestExecutor> orderedModuleTestExecutors = Stream.concat(jUnit5TestExecutors.stream(), jUnit4TestExecutors.stream()).collect(Collectors.toList());
for (ModuleTestExecutor moduleTestExecutor : orderedModuleTestExecutors) {
final CliTestSummary testExecutionSummary = moduleTestExecutor.executeTests(System.out, classNameFilterArg);
testsFoundCount += testExecutionSummary.getTestsFoundCount();
testsFailedCount += testExecutionSummary.getTestsFailedCount();
testsAbortedCount += testExecutionSummary.getTestsAbortedCount();
testsSkippedCount += testExecutionSummary.getTestsSkippedCount();
moduleResultMap.put(moduleTestExecutor.getModuleName(), testExecutionSummary);
}
System.out.println("\n\nAll Tests completed.");
for (ModuleTestExecutor moduleTestExecutor : orderedModuleTestExecutors) {
ModuleTestExecutor.printSummmary(System.out, moduleResultMap.get(moduleTestExecutor.getModuleName()), moduleTestExecutor.getModuleName());
}
System.out.println("\nModule Results:\n");
for (ModuleTestExecutor moduleTestExecutor : orderedModuleTestExecutors) {
System.out.println(getModuleResultLine(moduleTestExecutor.getModuleName(), moduleResultMap.get(moduleTestExecutor.getModuleName())));
}
System.out.println();
System.out.println(String.format(SUMMARY_TEMPLATE, testsFoundCount, testsFailedCount, testsAbortedCount, testsSkippedCount));
System.out.println("\nCompleted in " + (System.currentTimeMillis() - start) + "ms");
}
protected void setUpDirectories(String txCacheDirectoryPath, String testCasesDirectoryPath) {
if (testCasesDirectoryPath != null
&& pathExistsAsDirectory(testCasesDirectoryPath)
) {
TestConfig.getInstance().setFhirTestCasesDirectory(testCasesDirectoryPath);
} else {
throw new RuntimeException("fhir-test-cases directory does not exist: " + testCasesDirectoryPath);
}
try {
String txCacheDirectory = getOrCreateTxCacheDirectory(txCacheDirectoryPath);
if (!pathExistsAsDirectory(testCasesDirectoryPath)) {
throw new RuntimeException("txCache directory does not exist: " + txCacheDirectory);
}
TestConfig.getInstance().setTxCacheDirectory(txCacheDirectory);
} catch (IOException e) {
throw new RuntimeException("Unable to create temporary resource directory.", e);
}
}
private static String getOrCreateTxCacheDirectory(String txCacheDirectoryParam) throws IOException {
final String txCacheDirectory;
if (txCacheDirectoryParam != null) {
txCacheDirectory = txCacheDirectoryParam;
} else {
txCacheDirectory = Files.createTempDirectory("validator-test-tx-cache").toFile().getAbsolutePath();
TxCacheResourceExtractor.extractTxCacheResources(txCacheDirectory);
}
return txCacheDirectory;
}
@Nonnull
public static List<ModuleTestExecutor> getjUnit5TestExecutors(String[] moduleNamesArg) {
final String[] moduleNames = moduleNamesArg == null ? JUNIT5_MODULE_NAMES : moduleNamesArg;
return Arrays.stream(moduleNames)
.map(moduleName -> JUnit5ModuleTestExecutor.getStandardModuleTestExecutor(moduleName))
.collect(Collectors.toList());
}
@Nonnull
public static List<ModuleTestExecutor> getjUnit4TestExecutors(String[] moduleNamesArg) {
final List<ModuleTestExecutor> jUnit4TestExecutors = Arrays.asList(new JUnit4TestExecutor(VALIDATION_MODULE, JUNIT4_CLASSNAMES));
if (moduleNamesArg == null) {
return jUnit4TestExecutors;
}
return Arrays.stream(moduleNamesArg).anyMatch(moduleName -> VALIDATION_MODULE.equals(moduleName))
? jUnit4TestExecutors
: Arrays.asList();
}
}

View File

@ -0,0 +1,40 @@
package org.hl7.fhir.validation.testexecutor;
import java.util.Arrays;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import static org.hl7.fhir.validation.testexecutor.TestModules.JUNIT5_MODULE_NAMES;
public class TestExecutorParams {
private static final String MODULE_DELIMITER = ",";
public static boolean isValidModuleParam(String param) {
if (param == null) {
return true;
}
final String[] modules = param.split(MODULE_DELIMITER);
for (String module : modules) {
if (Arrays.stream(JUNIT5_MODULE_NAMES).noneMatch(i -> i.equals(module))) {
return false;
}
}
return true;
}
public static String[] parseModuleParam(String param) {
if (param == null) {
return null;
} else {
return param.split(MODULE_DELIMITER);
}
}
public static boolean isValidClassnameFilterParam(String param) {
try {
Pattern.compile(param);
return true;
} catch (PatternSyntaxException e) {
return false;
}
}
}

View File

@ -0,0 +1,21 @@
package org.hl7.fhir.validation.testexecutor;
import java.util.Arrays;
import java.util.List;
public class TestModules {
public static final String VALIDATION_MODULE = "org.hl7.fhir.validation";
public static final String[] JUNIT5_MODULE_NAMES = {
"org.hl7.fhir.utilities",
"org.hl7.fhir.convertors",
"org.hl7.fhir.dstu2",
"org.hl7.fhir.dstu2016may",
"org.hl7.fhir.dstu3",
"org.hl7.fhir.r4",
"org.hl7.fhir.r4b",
"org.hl7.fhir.r5",
VALIDATION_MODULE
};
public static final List<String> JUNIT4_CLASSNAMES = Arrays.asList("org.hl7.fhir.validation.tests.ValidationTests");
}

View File

@ -0,0 +1,64 @@
package org.hl7.fhir.validation.testexecutor;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class TxCacheResourceExtractor {
public static void extractTxCacheResources(String targetDirectory) throws IOException {
Path targetPath = Paths.get(targetDirectory);
URL jar = TestExecutor.class.getProtectionDomain().getCodeSource().getLocation();
ZipInputStream zip = new ZipInputStream(jar.openStream());
while(true) {
ZipEntry e = zip.getNextEntry();
if (e == null)
break;
processZipEntry(zip, targetPath, e);
}
}
private static void processZipEntry(ZipInputStream zip, Path targetPath, ZipEntry e) throws IOException {
String name = e.getName();
if (!name.startsWith(TestExecutor.TX_CACHE)) {
zip.closeEntry();
return;
}
Path sourcePath = Paths.get(name);
if (sourcePath.getNameCount() <= 1) {
zip.closeEntry();
return;
}
if (e.isDirectory()) {
zip.closeEntry();
return;
}
extractFileFromZipInputStream(zip, sourcePath, targetPath);
}
private static void extractFileFromZipInputStream(ZipInputStream zip, Path sourcePath, Path targetPath) throws IOException {
Path fileTargetPath = targetPath.resolve(sourcePath.subpath(1, sourcePath.getNameCount()));
makeFileParentDirsIfNotExist(fileTargetPath);
FileOutputStream fileOutputStream = new FileOutputStream(fileTargetPath.toFile());
for (int c = zip.read(); c != -1; c = zip.read()) {
fileOutputStream.write(c);
}
zip.closeEntry();
fileOutputStream.close();
}
private static void makeFileParentDirsIfNotExist(Path filePath) {
Path parent = filePath.getParent();
if (!parent.toFile().exists()) {
parent.toFile().mkdirs();
}
}
}

View File

@ -1,28 +1,23 @@
package org.hl7.fhir.validation.cli.services; package org.hl7.fhir.validation.cli.services;
import org.apache.commons.io.Charsets;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.hl7.fhir.r5.elementmodel.Manager; import org.hl7.fhir.r5.elementmodel.Manager;
import org.hl7.fhir.validation.ValidationEngine; import org.hl7.fhir.validation.ValidationEngine;
import org.hl7.fhir.validation.cli.model.CliContext; import org.hl7.fhir.validation.cli.model.CliContext;
import org.hl7.fhir.validation.cli.model.FileInfo; import org.hl7.fhir.validation.cli.model.FileInfo;
import org.hl7.fhir.validation.cli.model.ValidationRequest; import org.hl7.fhir.validation.cli.model.ValidationRequest;
import org.hl7.fhir.validation.tests.utilities.TestConstants;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.ArgumentMatchers; import org.mockito.ArgumentMatchers;
import org.mockito.Mockito; import org.mockito.Mockito;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import static org.hl7.fhir.validation.tests.utilities.TestUtilities.getTerminologyCacheDirectory;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
class ValidationServiceTest { class ValidationServiceTest {
@ -36,7 +31,7 @@ class ValidationServiceTest {
List<FileInfo> filesToValidate = new ArrayList<>(); List<FileInfo> filesToValidate = new ArrayList<>();
filesToValidate.add(new FileInfo().setFileName("test_resource.json").setFileContent(resource).setFileType(Manager.FhirFormat.JSON.getExtension())); filesToValidate.add(new FileInfo().setFileName("test_resource.json").setFileContent(resource).setFileType(Manager.FhirFormat.JSON.getExtension()));
ValidationRequest request = new ValidationRequest().setCliContext(new CliContext().setTxCache(Paths.get(TestConstants.TX_CACHE, "validationService").toString())).setFilesToValidate(filesToValidate); ValidationRequest request = new ValidationRequest().setCliContext(new CliContext().setTxCache(getTerminologyCacheDirectory("validationService"))).setFilesToValidate(filesToValidate);
// Validation run 1...nothing cached yet // Validation run 1...nothing cached yet
myService.validateSources(request); myService.validateSources(request);
Mockito.verify(sessionCache, Mockito.times(1)).cacheSession(ArgumentMatchers.any(ValidationEngine.class)); Mockito.verify(sessionCache, Mockito.times(1)).cacheSession(ArgumentMatchers.any(ValidationEngine.class));

View File

@ -0,0 +1,52 @@
package org.hl7.fhir.validation.testexecutor;
import org.hl7.fhir.utilities.tests.execution.CliTestSummary;
import org.hl7.fhir.utilities.tests.execution.ModuleTestExecutor;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import java.util.Arrays;
import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
public class TestExecutorTests {
private static ModuleTestExecutor mockModuleTestExecutor(String moduleName) {
ModuleTestExecutor moduleTestExecutor = mock(ModuleTestExecutor.class);
doReturn(moduleName).when(moduleTestExecutor).getModuleName();
CliTestSummary testSummary = mock(CliTestSummary.class);
doReturn(testSummary).when(moduleTestExecutor).executeTests(any(), any());
return moduleTestExecutor;
}
@Test
public void testTestExecutor() {
ModuleTestExecutor junit4TestExecutor = mockModuleTestExecutor("dummy.junit4");
List<ModuleTestExecutor> junit4TestExecutors = Arrays.asList(
junit4TestExecutor
);
ModuleTestExecutor junit5TestExecutor = mockModuleTestExecutor("dummy.junit5");
List<ModuleTestExecutor> junit5TestExecutors = Arrays.asList(
junit5TestExecutor
);
TestExecutor testExecutor = Mockito.spy(new TestExecutor(junit4TestExecutors, junit5TestExecutors));
final String txCacheDirectoryPath = "dummyTxCacheDirectoryPath";
final String testCasesDirectoryPath = System.getProperty("user.dir");
doNothing().when(testExecutor).setUpDirectories(txCacheDirectoryPath, testCasesDirectoryPath);
testExecutor.executeTests(null, txCacheDirectoryPath, testCasesDirectoryPath);
verify(testExecutor).getJUnit4TestExecutors();
}
}

View File

@ -0,0 +1,33 @@
package org.hl7.fhir.validation.testexecutor;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class TxCacheResourceExtractorTest {
/**
*
* @return true if the TestConstants.getTxCacheDirectory() is not set to the default value
*/
public static final boolean isCliRun() {
return !org.hl7.fhir.r5.test.utils.TestConstants.TX_CACHE.equals(org.hl7.fhir.utilities.tests.TestConfig.getInstance().getTxCacheDirectory());
}
@Test
public void testTxCacheExtraction() throws IOException {
if (isCliRun()) {
return;
}
Path path = Files.createTempDirectory("txCacheExtractionTest");
TxCacheResourceExtractor.extractTxCacheResources(path.toString());
}
}

View File

@ -7,7 +7,8 @@ import org.hl7.fhir.utilities.TextFile;
import org.hl7.fhir.utilities.VersionUtilities; import org.hl7.fhir.utilities.VersionUtilities;
import org.hl7.fhir.validation.IgLoader; import org.hl7.fhir.validation.IgLoader;
import org.hl7.fhir.validation.ValidationEngine; import org.hl7.fhir.validation.ValidationEngine;
import org.junit.Test; import org.junit.jupiter.api.Test;
public class LoadIgTests { public class LoadIgTests {

View File

@ -3,10 +3,9 @@ package org.hl7.fhir.validation.tests;
import org.hl7.fhir.r5.elementmodel.Manager.FhirFormat; import org.hl7.fhir.r5.elementmodel.Manager.FhirFormat;
import org.hl7.fhir.r5.test.utils.TestingUtilities; import org.hl7.fhir.r5.test.utils.TestingUtilities;
import org.hl7.fhir.validation.NativeHostServices; import org.hl7.fhir.validation.NativeHostServices;
import org.hl7.fhir.validation.tests.utilities.TestConstants;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.nio.file.Paths; import static org.hl7.fhir.validation.tests.utilities.TestUtilities.getTerminologyCacheDirectory;
public class NativeHostServiceTester { public class NativeHostServiceTester {
@ -16,7 +15,7 @@ public class NativeHostServiceTester {
NativeHostServices svc = new NativeHostServices(); NativeHostServices svc = new NativeHostServices();
svc.init("hl7.fhir.r4.core#4.0.1"); svc.init("hl7.fhir.r4.core#4.0.1");
svc.connectToTxSvc("http://tx.fhir.org/r4", null, Paths.get(TestConstants.TX_CACHE, "nativeHost").toString()); svc.connectToTxSvc("http://tx.fhir.org/r4", null, getTerminologyCacheDirectory("nativeHost").toString());
System.out.println("base: "+svc.status()); System.out.println("base: "+svc.status());
svc.seeResource(TestingUtilities.loadTestResourceBytes("validator", "misc", "ValueSet-dicm-2-AnatomicModifier.json"), FhirFormat.JSON); svc.seeResource(TestingUtilities.loadTestResourceBytes("validator", "misc", "ValueSet-dicm-2-AnatomicModifier.json"), FhirFormat.JSON);

View File

@ -5,7 +5,6 @@ import java.util.List;
import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.FhirPublication;
import org.hl7.fhir.utilities.tests.CacheVerificationLogger; import org.hl7.fhir.utilities.tests.CacheVerificationLogger;
import org.hl7.fhir.validation.tests.utilities.TestConstants;
import org.hl7.fhir.r5.elementmodel.Manager.FhirFormat; import org.hl7.fhir.r5.elementmodel.Manager.FhirFormat;
import org.hl7.fhir.r5.model.OperationOutcome; import org.hl7.fhir.r5.model.OperationOutcome;
import org.hl7.fhir.r5.model.OperationOutcome.IssueSeverity; import org.hl7.fhir.r5.model.OperationOutcome.IssueSeverity;

View File

@ -2,6 +2,8 @@ package org.hl7.fhir.validation.tests.utilities;
import org.hl7.fhir.r5.context.TerminologyCache; import org.hl7.fhir.r5.context.TerminologyCache;
import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.FhirPublication;
import org.hl7.fhir.utilities.tests.TestConfig;
import org.hl7.fhir.utilities.tests.TestConstants;
import org.hl7.fhir.validation.ValidationEngine; import org.hl7.fhir.validation.ValidationEngine;
import java.nio.file.Paths; import java.nio.file.Paths;
@ -16,7 +18,7 @@ public class TestUtilities {
.withCanRunWithoutTerminologyServer(canRunWithoutTerminologyServer) .withCanRunWithoutTerminologyServer(canRunWithoutTerminologyServer)
.withVersion(vString) .withVersion(vString)
.withUserAgent(TestConstants.USER_AGENT) .withUserAgent(TestConstants.USER_AGENT)
.withTerminologyCachePath(Paths.get(TestConstants.TX_CACHE, vString).toString()) .withTerminologyCachePath(getTerminologyCacheDirectory(vString))
.withTxServer(txServer, txLog, version) .withTxServer(txServer, txLog, version)
.fromSource(src); .fromSource(src);
@ -24,11 +26,15 @@ public class TestUtilities {
return validationEngine; return validationEngine;
} }
public static String getTerminologyCacheDirectory(String ... testSetPath) {
return Paths.get(TestConfig.getInstance().getTxCacheDirectory("org.hl7.fhir.validation"), testSetPath).toString();
}
public static ValidationEngine getValidationEngine(java.lang.String src, java.lang.String txServer, FhirPublication version, java.lang.String vString) throws Exception { public static ValidationEngine getValidationEngine(java.lang.String src, java.lang.String txServer, FhirPublication version, java.lang.String vString) throws Exception {
final ValidationEngine validationEngine = new ValidationEngine.ValidationEngineBuilder() final ValidationEngine validationEngine = new ValidationEngine.ValidationEngineBuilder()
.withVersion(vString) .withVersion(vString)
.withUserAgent(TestConstants.USER_AGENT) .withUserAgent(TestConstants.USER_AGENT)
.withTerminologyCachePath(Paths.get(TestConstants.TX_CACHE, vString).toString()) .withTerminologyCachePath(getTerminologyCacheDirectory(vString))
.withTxServer(txServer, TestConstants.TX_CACHE_LOG, version) .withTxServer(txServer, TestConstants.TX_CACHE_LOG, version)
.fromSource(src); .fromSource(src);
TerminologyCache.setCacheErrors(true); TerminologyCache.setCacheErrors(true);

View File

@ -1,11 +0,0 @@
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://medcomfhir.dk/fhir/core/1.0/CodeSystem/medcom-messaging-activityCodes",
"code" : "new-message"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"true"}####
v: {
"severity" : "error",
"error" : "The code system 'http://medcomfhir.dk/fhir/core/1.0/CodeSystem/medcom-messaging-activityCodes' is not known (encountered paired with code = 'new-message'); The code provided (http://medcomfhir.dk/fhir/core/1.0/CodeSystem/medcom-messaging-activityCodes#new-message) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)",
"class" : "CODESYSTEM_UNSUPPORTED"
}
-------------------------------------------------------------------------------------

View File

@ -1,22 +0,0 @@
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://terminology.hl7.org/CodeSystem/security-source-type",
"code" : "4",
"display" : "Application Server"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "Application Server",
"code" : "4",
"system" : "http://terminology.hl7.org/CodeSystem/security-source-type"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://terminology.hl7.org/CodeSystem/security-source-type",
"code" : "4"
}, "url": "http://hl7.org/fhir/ValueSet/audit-source-type--0", "version": "4.5.0", "lang":"null", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "Application Server",
"code" : "4",
"system" : "http://terminology.hl7.org/CodeSystem/security-source-type"
}
-------------------------------------------------------------------------------------

View File

@ -1,11 +0,0 @@
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://terminology.hl7.org/CodeSystem/v3-ActReason",
"code" : "HTEST"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "test health data",
"code" : "HTEST",
"system" : "http://terminology.hl7.org/CodeSystem/v3-ActReason"
}
-------------------------------------------------------------------------------------

View File

@ -1,21 +0,0 @@
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://terminology.hl7.org/CodeSystem/v3-ParticipationType",
"code" : "IRCP"
}, "url": "http://hl7.org/fhir/ValueSet/participation-role-type--5", "version": "4.5.0", "lang":"null", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "information recipient",
"code" : "IRCP",
"system" : "http://terminology.hl7.org/CodeSystem/v3-ParticipationType"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://terminology.hl7.org/CodeSystem/v3-ParticipationType",
"code" : "IRCP"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "information recipient",
"code" : "IRCP",
"system" : "http://terminology.hl7.org/CodeSystem/v3-ParticipationType"
}
-------------------------------------------------------------------------------------

View File

@ -1,21 +0,0 @@
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://terminology.hl7.org/CodeSystem/v3-RoleClass",
"code" : "PROV"
}, "url": "http://hl7.org/fhir/ValueSet/participation-role-type--1", "version": "4.5.0", "lang":"null", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "healthcare provider",
"code" : "PROV",
"system" : "http://terminology.hl7.org/CodeSystem/v3-RoleClass"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://terminology.hl7.org/CodeSystem/v3-RoleClass",
"code" : "PROV"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "healthcare provider",
"code" : "PROV",
"system" : "http://terminology.hl7.org/CodeSystem/v3-RoleClass"
}
-------------------------------------------------------------------------------------

View File

@ -12,11 +12,11 @@
"url" : "http://hl7.org/fhir/3.0/StructureDefinition/extension-CapabilityStatement.acceptUnknown", "url" : "http://hl7.org/fhir/3.0/StructureDefinition/extension-CapabilityStatement.acceptUnknown",
"valueCode" : "both" "valueCode" : "both"
}], }],
"url" : "http://fhir.healthintersections.com.au/open/metadata", "url" : "http://tx.fhir.org/r2/metadata",
"version" : "1.0.2-2.0.12-SNAPSHOT", "version" : "1.0.2-2.0.14",
"name" : "FHIR Reference Server Conformance Statement", "name" : "FHIR Reference Server Conformance Statement",
"status" : "active", "status" : "active",
"date" : "2022-01-06T15:44:28.286Z", "date" : "2022-06-09T21:15:44.743Z",
"contact" : [{ "contact" : [{
"telecom" : [{ "telecom" : [{
"system" : "other", "system" : "other",
@ -27,8 +27,12 @@
"kind" : "instance", "kind" : "instance",
"software" : { "software" : {
"name" : "Reference Server", "name" : "Reference Server",
"version" : "2.0.12-SNAPSHOT", "version" : "2.0.14",
"releaseDate" : "2021-12-20T02:28:03.769Z" "releaseDate" : "2022-05-13T19:50:55.040Z"
},
"implementation" : {
"description" : "FHIR Server running at http://tx.fhir.org/r2",
"url" : "http://tx.fhir.org/r2"
}, },
"fhirVersion" : "1.0.2", "fhirVersion" : "1.0.2",
"format" : ["application/xml+fhir", "format" : ["application/xml+fhir",

View File

@ -12,11 +12,11 @@
"url" : "http://hl7.org/fhir/3.0/StructureDefinition/extension-CapabilityStatement.acceptUnknown", "url" : "http://hl7.org/fhir/3.0/StructureDefinition/extension-CapabilityStatement.acceptUnknown",
"valueCode" : "both" "valueCode" : "both"
}], }],
"url" : "http://fhir.healthintersections.com.au/open/metadata", "url" : "http://tx.fhir.org/r3/metadata",
"version" : "3.0.2-2.0.12-SNAPSHOT", "version" : "3.0.2-2.0.14",
"name" : "FHIR Reference Server Conformance Statement", "name" : "FHIR Reference Server Conformance Statement",
"status" : "active", "status" : "active",
"date" : "2022-01-10T11:02:52.097Z", "date" : "2022-06-09T21:14:05.196Z",
"contact" : [{ "contact" : [{
"telecom" : [{ "telecom" : [{
"system" : "other", "system" : "other",
@ -27,8 +27,12 @@
"instantiates" : ["http://hl7.org/fhir/CapabilityStatement/terminology-server"], "instantiates" : ["http://hl7.org/fhir/CapabilityStatement/terminology-server"],
"software" : { "software" : {
"name" : "Reference Server", "name" : "Reference Server",
"version" : "2.0.12-SNAPSHOT", "version" : "2.0.14",
"releaseDate" : "2021-12-20T02:28:03.769Z" "releaseDate" : "2022-05-13T19:50:55.040Z"
},
"implementation" : {
"description" : "FHIR Server running at http://tx.fhir.org/r3",
"url" : "http://tx.fhir.org/r3"
}, },
"fhirVersion" : "3.0.2", "fhirVersion" : "3.0.2",
"format" : ["application/fhir+xml", "format" : ["application/fhir+xml",
@ -60,7 +64,7 @@
}, },
{ {
"name" : "versions", "name" : "versions",
"definition" : "/OperationDefinition/fso-versions" "definition" : "http://tx.fhir.org/r3/OperationDefinition/fso-versions"
}] }]
}] }]
} }

View File

@ -12,11 +12,11 @@
"url" : "http://hl7.org/fhir/3.0/StructureDefinition/extension-CapabilityStatement.acceptUnknown", "url" : "http://hl7.org/fhir/3.0/StructureDefinition/extension-CapabilityStatement.acceptUnknown",
"valueCode" : "both" "valueCode" : "both"
}], }],
"url" : "http://fhir.healthintersections.com.au/open/metadata", "url" : "http://tx.fhir.org/r3/metadata",
"version" : "3.0.2-2.0.12-SNAPSHOT", "version" : "3.0.2-2.0.14",
"name" : "FHIR Reference Server Conformance Statement", "name" : "FHIR Reference Server Conformance Statement",
"status" : "active", "status" : "active",
"date" : "2022-01-10T11:02:52.097Z", "date" : "2022-06-09T21:13:00.228Z",
"contact" : [{ "contact" : [{
"telecom" : [{ "telecom" : [{
"system" : "other", "system" : "other",
@ -27,8 +27,12 @@
"instantiates" : ["http://hl7.org/fhir/CapabilityStatement/terminology-server"], "instantiates" : ["http://hl7.org/fhir/CapabilityStatement/terminology-server"],
"software" : { "software" : {
"name" : "Reference Server", "name" : "Reference Server",
"version" : "2.0.12-SNAPSHOT", "version" : "2.0.14",
"releaseDate" : "2021-12-20T02:28:03.769Z" "releaseDate" : "2022-05-13T19:50:55.040Z"
},
"implementation" : {
"description" : "FHIR Server running at http://tx.fhir.org/r3",
"url" : "http://tx.fhir.org/r3"
}, },
"fhirVersion" : "3.0.2", "fhirVersion" : "3.0.2",
"format" : ["application/fhir+xml", "format" : ["application/fhir+xml",
@ -60,7 +64,7 @@
}, },
{ {
"name" : "versions", "name" : "versions",
"definition" : "/OperationDefinition/fso-versions" "definition" : "http://tx.fhir.org/r3/OperationDefinition/fso-versions"
}] }]
}] }]
} }

View File

@ -155,7 +155,7 @@ v: {
"code" : "48765-2", "code" : "48765-2",
"system" : "http://loinc.org", "system" : "http://loinc.org",
"severity" : "warning", "severity" : "warning",
"error" : "The display \"Allergies\" is not a valid display for the code {http://loinc.org}48765-2 - should be one of ['Allergies and adverse reactions Document', 'Allergies &or adverse reactions Doc', '临床文档型' (zh-CN), '临床文档' (zh-CN), '文档' (zh-CN), '文书' (zh-CN), '医疗文书' (zh-CN), '临床医疗文书 医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '病患' (zh-CN), '病号' (zh-CN), '超系统 - 病人 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 变态反应与不良反应 文档.其他' (zh-CN), '杂项类文档' (zh-CN), '其他文档 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 杂项' (zh-CN), '杂项类' (zh-CN), '杂项试验 过敏反应' (zh-CN), '过敏' (zh-CN), '' (zh-CN), 'Allergie e reazioni avverse Documentazione miscellanea Miscellanea Osservazione paziente Punto nel tempo (episodio)' (it-IT), 'Документ Точка во времени' (ru-RU), 'Момент' (ru-RU)] (from http://tx.fhir.org/r3)" "error" : "The display \"Allergies\" is not a valid display for the code {http://loinc.org}48765-2 - should be one of ['Allergies and adverse reactions Document', 'Allergies &or adverse reactions Doc', '', '临床文档型' (zh-CN), '临床文档' (zh-CN), '文档' (zh-CN), '文书' (zh-CN), '医疗文书' (zh-CN), '临床医疗文书 医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '病患' (zh-CN), '病号' (zh-CN), '超系统 - 病人 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 变态反应与不良反应 文档.其他' (zh-CN), '杂项类文档' (zh-CN), '其他文档 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 杂项' (zh-CN), '杂项类' (zh-CN), '杂项试验 过敏反应' (zh-CN), '过敏' (zh-CN), 'Allergie e reazioni avverse Documentazione miscellanea Miscellanea Osservazione paziente Punto nel tempo (episodio)' (it-IT), 'Документ Точка во времени' (ru-RU), 'Момент' (ru-RU)] (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -245,7 +245,7 @@ v: {
"code" : "18776-5", "code" : "18776-5",
"system" : "http://loinc.org", "system" : "http://loinc.org",
"severity" : "warning", "severity" : "warning",
"error" : "The display \"Plan of care\" is not a valid display for the code {http://loinc.org}18776-5 - should be one of ['Plan of care note', 'Plan of care note', '临床文档型' (zh-CN), '临床文档' (zh-CN), '文档' (zh-CN), '文书' (zh-CN), '医疗文书' (zh-CN), '临床医疗文书 事件发生的地方' (zh-CN), '场景' (zh-CN), '环境' (zh-CN), '背景 医疗服务(照护服务、护理服务、护理、照护、医疗照护、诊疗、诊疗服务、照顾、看护)计划(方案)记录 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 文档本体' (zh-CN), '临床文档本体' (zh-CN), '文档本体' (zh-CN), '文书本体' (zh-CN), '医疗文书本体' (zh-CN), '临床医疗文书本体 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 未加明确说明的角色 笔记' (zh-CN), '按语' (zh-CN), '注释' (zh-CN), '说明' (zh-CN), '票据' (zh-CN), '单据' (zh-CN), '证明书' (zh-CN), '' (zh-CN), 'Documentazione dell''ontologia Osservazione Piano di cura Punto nel tempo (episodio) Ruolo non specificato' (it-IT)] (from http://tx.fhir.org/r3)" "error" : "The display \"Plan of care\" is not a valid display for the code {http://loinc.org}18776-5 - should be one of ['Plan of care note', 'Plan of care note', '', '临床文档型' (zh-CN), '临床文档' (zh-CN), '文档' (zh-CN), '文书' (zh-CN), '医疗文书' (zh-CN), '临床医疗文书 事件发生的地方' (zh-CN), '场景' (zh-CN), '环境' (zh-CN), '背景 医疗服务(照护服务、护理服务、护理、照护、医疗照护、诊疗、诊疗服务、照顾、看护)计划(方案)记录 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 文档本体' (zh-CN), '临床文档本体' (zh-CN), '文档本体' (zh-CN), '文书本体' (zh-CN), '医疗文书本体' (zh-CN), '临床医疗文书本体 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 未加明确说明的角色 笔记' (zh-CN), '按语' (zh-CN), '注释' (zh-CN), '说明' (zh-CN), '票据' (zh-CN), '单据' (zh-CN), '证明书' (zh-CN), 'Documentazione dell''ontologia Osservazione Piano di cura Punto nel tempo (episodio) Ruolo non specificato' (it-IT)] (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -280,7 +280,7 @@ v: {
"code" : "10187-3", "code" : "10187-3",
"system" : "http://loinc.org", "system" : "http://loinc.org",
"severity" : "warning", "severity" : "warning",
"error" : "The display \"Review of systems Narrative Reporte\" is not a valid display for the code {http://loinc.org}10187-3 - should be one of ['Review of systems Narrative - Reported', 'Review of systems', '医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '病患' (zh-CN), '病号' (zh-CN), '超系统 - 病人 历史纪录与体格检查 历史纪录与体格检查.历史记录' (zh-CN), '历史纪录与体格检查.历史记录类' (zh-CN), '历史纪录与体格检查.历史记录类别' (zh-CN), '历史纪录与体格检查.病史' (zh-CN), '历史纪录与体格检查.病史类' (zh-CN), '历史纪录与体格检查.病史类别' (zh-CN), '历史纪录与体格检查.病史记录' (zh-CN), '历史纪录与体格检查.病史记录类' (zh-CN), '历史纪录与体格检查.病史记录类别' (zh-CN), '历史纪录与体格检查小节.历史记录' (zh-CN), '历史纪录与体格检查小节.历史记录类' (zh-CN), '历史纪录与体格检查小节.历史记录类别' (zh-CN), '历史纪录与体格检查小节.病史' (zh-CN), '历史纪录与体格检查小节.病史类' (zh-CN), '历史纪录与体格检查小节.病史类别' (zh-CN), '历史纪录与体格检查小节.病史记 历史纪录与体格检查小节 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 叙述' (zh-CN), '叙述性文字' (zh-CN), '报告' (zh-CN), '报告型' (zh-CN), '文字叙述' (zh-CN), '文本叙述型' (zh-CN), '文本描述' (zh-CN), '文本描述型 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 病史与体格检查 系统回顾' (zh-CN), '系统审核' (zh-CN), '' (zh-CN), 'Anamnesi Osservazione paziente Punto nel tempo (episodio)' (it-IT), 'Анамнестические сведения' (ru-RU), 'Сообщенная третьим лицом информация Описательный Точка во времени' (ru-RU), 'Момент' (ru-RU)] (from http://tx.fhir.org/r3)" "error" : "The display \"Review of systems Narrative Reporte\" is not a valid display for the code {http://loinc.org}10187-3 - should be one of ['Review of systems Narrative - Reported', 'Review of systems', '', '医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '病患' (zh-CN), '病号' (zh-CN), '超系统 - 病人 历史纪录与体格检查 历史纪录与体格检查.历史记录' (zh-CN), '历史纪录与体格检查.历史记录类' (zh-CN), '历史纪录与体格检查.历史记录类别' (zh-CN), '历史纪录与体格检查.病史' (zh-CN), '历史纪录与体格检查.病史类' (zh-CN), '历史纪录与体格检查.病史类别' (zh-CN), '历史纪录与体格检查.病史记录' (zh-CN), '历史纪录与体格检查.病史记录类' (zh-CN), '历史纪录与体格检查.病史记录类别' (zh-CN), '历史纪录与体格检查小节.历史记录' (zh-CN), '历史纪录与体格检查小节.历史记录类' (zh-CN), '历史纪录与体格检查小节.历史记录类别' (zh-CN), '历史纪录与体格检查小节.病史' (zh-CN), '历史纪录与体格检查小节.病史类' (zh-CN), '历史纪录与体格检查小节.病史类别 历史纪录与体格检查小节 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 叙述' (zh-CN), '叙述性文字' (zh-CN), '报告' (zh-CN), '报告型' (zh-CN), '文字叙述' (zh-CN), '文本叙述型' (zh-CN), '文本描述' (zh-CN), '文本描述型 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 病史与体格检查 系统回顾' (zh-CN), '系统审核' (zh-CN), 'Anamnesi Osservazione paziente Punto nel tempo (episodio)' (it-IT), 'Анамнестические сведения' (ru-RU), 'Сообщенная третьим лицом информация Описательный Точка во времени' (ru-RU), 'Момент' (ru-RU)] (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {

View File

@ -130,7 +130,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 823681000000100 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"823681000000100\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#823681000000100) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 823681000000100 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"823681000000100\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#823681000000100) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -140,7 +140,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 886921000000105 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"886921000000105\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#886921000000105) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 886921000000105 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"886921000000105\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#886921000000105) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -150,7 +150,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 1077881000000105 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"1077881000000105\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#1077881000000105) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 1077881000000105 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"1077881000000105\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#1077881000000105) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -160,7 +160,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 887181000000106 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"887181000000106\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#887181000000106) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 887181000000106 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"887181000000106\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#887181000000106) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -170,7 +170,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 887161000000102 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"887161000000102\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#887161000000102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 887161000000102 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"887161000000102\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#887161000000102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -180,7 +180,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 1052891000000108 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"1052891000000108\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#1052891000000108) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 1052891000000108 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"1052891000000108\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#1052891000000108) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -190,7 +190,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 715851000000102 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"715851000000102\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#715851000000102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 715851000000102 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"715851000000102\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#715851000000102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -200,7 +200,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 717121000000105 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"717121000000105\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#717121000000105) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 717121000000105 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"717121000000105\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#717121000000105) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -210,7 +210,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 933361000000108 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"933361000000108\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#933361000000108) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 933361000000108 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"933361000000108\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#933361000000108) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -220,7 +220,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 887171000000109 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"887171000000109\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#887171000000109) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 887171000000109 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"887171000000109\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#887171000000109) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -230,7 +230,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 887201000000105 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"887201000000105\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#887201000000105) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 887201000000105 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"887201000000105\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#887201000000105) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -240,7 +240,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 1052951000000105 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"1052951000000105\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#1052951000000105) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 1052951000000105 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"1052951000000105\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#1052951000000105) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -250,7 +250,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 886731000000109 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"886731000000109\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#886731000000109) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 886731000000109 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"886731000000109\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#886731000000109) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -260,7 +260,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 887231000000104 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"887231000000104\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#887231000000104) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 887231000000104 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"887231000000104\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#887231000000104) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -270,7 +270,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 9290701000001101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"9290701000001101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#9290701000001101) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)" "error" : "Unable to find code 9290701000001101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"9290701000001101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#9290701000001101) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -332,6 +332,15 @@ v: {
"system" : "http://snomed.info/sct" "system" : "http://snomed.info/sct"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : {
"system" : "http://snomed.info/sct",
"code" : "11181000146103"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"severity" : "error",
"error" : "Unable to find code 11181000146103 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"11181000146103\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#11181000146103) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
}
-------------------------------------------------------------------------------------
{"code" : { {"code" : {
"system" : "http://snomed.info/sct", "system" : "http://snomed.info/sct",
"code" : "27113001", "code" : "27113001",
@ -343,12 +352,3 @@ v: {
"system" : "http://snomed.info/sct" "system" : "http://snomed.info/sct"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : {
"system" : "http://snomed.info/sct",
"code" : "11181000146103"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"severity" : "error",
"error" : "Unable to find code 11181000146103 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"11181000146103\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#11181000146103) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r3)"
}
-------------------------------------------------------------------------------------

View File

@ -8,11 +8,11 @@
"display" : "Subsetted" "display" : "Subsetted"
}] }]
}, },
"url" : "http://fhir.healthintersections.com.au/open/metadata", "url" : "http://tx.fhir.org/r4/metadata",
"version" : "4.0.1-2.0.12-SNAPSHOT", "version" : "4.0.1-2.0.14",
"name" : "FHIR Reference Server Conformance Statement", "name" : "FHIR Reference Server Conformance Statement",
"status" : "active", "status" : "active",
"date" : "2022-01-10T11:07:19.254Z", "date" : "2022-06-09T21:09:34.321Z",
"contact" : [{ "contact" : [{
"telecom" : [{ "telecom" : [{
"system" : "other", "system" : "other",
@ -23,8 +23,12 @@
"instantiates" : ["http://hl7.org/fhir/CapabilityStatement/terminology-server"], "instantiates" : ["http://hl7.org/fhir/CapabilityStatement/terminology-server"],
"software" : { "software" : {
"name" : "Reference Server", "name" : "Reference Server",
"version" : "2.0.12-SNAPSHOT", "version" : "2.0.14",
"releaseDate" : "2021-12-20T02:28:03.769Z" "releaseDate" : "2022-05-13T19:50:55.040Z"
},
"implementation" : {
"description" : "FHIR Server running at http://tx.fhir.org/r4",
"url" : "http://tx.fhir.org/r4"
}, },
"fhirVersion" : "4.0.1", "fhirVersion" : "4.0.1",
"format" : ["application/fhir+xml", "format" : ["application/fhir+xml",
@ -56,7 +60,7 @@
}, },
{ {
"name" : "versions", "name" : "versions",
"definition" : "/OperationDefinition/fso-versions" "definition" : "http://tx.fhir.org/r4/OperationDefinition/fso-versions"
}] }]
}] }]
} }

View File

@ -1,11 +1,11 @@
{ {
"resourceType" : "TerminologyCapabilities", "resourceType" : "TerminologyCapabilities",
"id" : "FhirServer", "id" : "FhirServer",
"url" : "http://fhir.healthintersections.com.au/open/metadata", "url" : "http://tx.fhir.org/r4/metadata",
"version" : "1.0.0", "version" : "1.0.0",
"name" : "FHIR Reference Server Teminology Capability Statement", "name" : "FHIR Reference Server Teminology Capability Statement",
"status" : "active", "status" : "active",
"date" : "2022-01-07T08:11:26.721Z", "date" : "2022-06-09T11:12:53.805Z",
"contact" : [{ "contact" : [{
"telecom" : [{ "telecom" : [{
"system" : "other", "system" : "other",
@ -832,9 +832,15 @@
{ {
"uri" : "http://hl7.org/fhir/us/core/CodeSystem/us-core-documentreference-category" "uri" : "http://hl7.org/fhir/us/core/CodeSystem/us-core-documentreference-category"
}, },
{
"uri" : "http://hl7.org/fhir/us/core/CodeSystem/us-core-observation-category"
},
{ {
"uri" : "http://hl7.org/fhir/us/core/CodeSystem/us-core-provenance-participant-type" "uri" : "http://hl7.org/fhir/us/core/CodeSystem/us-core-provenance-participant-type"
}, },
{
"uri" : "http://hl7.org/fhir/us/core/CodeSystem/us-core-tags"
},
{ {
"uri" : "http://hl7.org/fhir/variable-type" "uri" : "http://hl7.org/fhir/variable-type"
}, },

View File

@ -36,7 +36,7 @@ v: {
"code" : "59284-0", "code" : "59284-0",
"system" : "http://loinc.org", "system" : "http://loinc.org",
"severity" : "warning", "severity" : "warning",
"error" : "The display \"Patient Authorization Signature\" is not a valid display for the code {http://loinc.org}59284-0 - should be one of ['Consent Document', 'Consent', '临床文档型' (zh-CN), '临床文档' (zh-CN), '文档' (zh-CN), '文书' (zh-CN), '医疗文书' (zh-CN), '临床医疗文书 事件发生的地方' (zh-CN), '场景' (zh-CN), '环境' (zh-CN), '背景 医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '超系统 - 病人 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 同意书' (zh-CN), '知情同意' (zh-CN), '知情同意书 文档本体' (zh-CN), '临床文档本体' (zh-CN), '文档本体' (zh-CN), '文书本体' (zh-CN), '医疗文书本体' (zh-CN), '临床医疗文书本体 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间' (zh-CN), 'Documentazione dell''ontologia Osservazione Punto nel tempo (episodio)' (it-IT), '' (it-IT)] (from http://tx.fhir.org/r4)" "error" : "The display \"Patient Authorization Signature\" is not a valid display for the code {http://loinc.org}59284-0 - should be one of ['Consent Document', 'Consent', '', '临床文档型' (zh-CN), '临床文档' (zh-CN), '文档' (zh-CN), '文书' (zh-CN), '医疗文书' (zh-CN), '临床医疗文书 事件发生的地方' (zh-CN), '场景' (zh-CN), '环境' (zh-CN), '背景 医疗服务对象' (zh-CN), '客户' (zh-CN), '病人' (zh-CN), '超系统 - 病人 发现是一个原子型临床观察指标,并不是作为印象的概括陈述。体格检查、病史、系统检查及其他此类观察指标的属性均为发现。它们的标尺对于编码型发现可能是名义型,而对于叙述型文本之中所报告的发现,则可能是叙述型。' (zh-CN), '发现物' (zh-CN), '所见' (zh-CN), '结果' (zh-CN), '结论 同意书' (zh-CN), '知情同意' (zh-CN), '知情同意书 文档本体' (zh-CN), '临床文档本体' (zh-CN), '文档本体' (zh-CN), '文书本体' (zh-CN), '医疗文书本体' (zh-CN), '临床医疗文书本体 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间' (zh-CN), 'Documentazione dell''ontologia Osservazione Punto nel tempo (episodio)' (it-IT)] (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -153,6 +153,15 @@ v: {
"system" : "urn:ietf:bcp:47" "system" : "urn:ietf:bcp:47"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : {
"code" : "application/xml"
}, "url": "http://hl7.org/fhir/ValueSet/mimetypes", "version": "4.0.1", "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"true", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "application/xml",
"code" : "application/xml",
"system" : "urn:ietf:bcp:13"
}
-------------------------------------------------------------------------------------
{"code" : { {"code" : {
"code" : "text/xml" "code" : "text/xml"
}, "url": "http://hl7.org/fhir/ValueSet/mimetypes", "version": "4.0.1", "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"true", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "url": "http://hl7.org/fhir/ValueSet/mimetypes", "version": "4.0.1", "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"true", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
@ -828,7 +837,7 @@ v: {
}, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "versionFlexible":"false"}#### }, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 10821000202101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"10821000202101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#10821000202101) is not valid in the value set 'no-colonoscopy-sedation-level' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 10821000202101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"10821000202101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#10821000202101) is not valid in the value set 'no-colonoscopy-sedation-level' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -1533,78 +1542,3 @@ v: {
"system" : "urn:iso:std:iso:3166" "system" : "urn:iso:std:iso:3166"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : {
"system" : "http://snomed.info/sct",
"code" : "10821000202101",
"display" : "Narkose eller dyp sedasjon med anestesistøtte"
}, "valueSet" :{
"resourceType" : "ValueSet",
"compose" : {
"include" : [{
"system" : "http://snomed.info/sct",
"concept" : [{
"code" : "10821000202101",
"display" : "Narkose eller dyp sedasjon med anestesistøtte",
"designation" : [{
"language" : "no",
"use" : {
"system" : "http://snomed.info/sct",
"code" : "900000000000003001",
"display" : "Fully specified name"
},
"value" : "Narkose eller dyp sedasjon med anestesistøtte"
}]
}]
},
{
"system" : "http://terminology.hl7.org/CodeSystem/special-values",
"concept" : [{
"code" : "nil-known",
"display" : "Ingen",
"designation" : [{
"language" : "en",
"use" : {
"system" : "http://snomed.info/sct",
"code" : "900000000000003001",
"display" : "Fully specified name"
},
"value" : "Nil Known"
}]
}]
}]
},
"expansion" : {
"contains" : [{
"system" : "http://snomed.info/sct",
"code" : "10821000202101",
"display" : "Narkose eller dyp sedasjon med anestesistøtte"
},
{
"system" : "http://terminology.hl7.org/CodeSystem/special-values",
"code" : "nil-known",
"display" : "Ingen"
}]
}
}, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "versionFlexible":"false"}####
v: {
"severity" : "error",
"error" : "Unable to find code 10821000202101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"10821000202101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#10821000202101) is not valid in the value set 'no-colonoscopy-sedation-level' (from http://tx.fhir.org/r4)"
}
-------------------------------------------------------------------------------------
{"code" : {
"code" : "pdf"
}, "url": "http://hl7.org/fhir/ValueSet/mimetypes", "version": "4.0.1", "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"true", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"severity" : "error",
"error" : "The code \"pdf\" is not valid in the system urn:ietf:bcp:13; The code provided (urn:ietf:bcp:13#pdf) is not valid in the value set 'Mime Types' (from http://tx.fhir.org/r4)"
}
-------------------------------------------------------------------------------------
{"code" : {
"code" : "application/xml"
}, "url": "http://hl7.org/fhir/ValueSet/mimetypes", "version": "4.0.1", "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"true", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "application/xml",
"code" : "application/xml",
"system" : "urn:ietf:bcp:13"
}
-------------------------------------------------------------------------------------

View File

@ -9,6 +9,46 @@ v: {
"system" : "http://loinc.org" "system" : "http://loinc.org"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : {
"system" : "http://loinc.org",
"code" : "11502-2"
}, "url": "http://hl7.org/fhir/ValueSet/doc-typecodes--0", "version": "4.0.1", "lang":"null", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "Laboratory report",
"code" : "11502-2",
"system" : "http://loinc.org"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://loinc.org",
"code" : "11502-2"
}, "url": "http://hl7.org/fhir/ValueSet/doc-typecodes", "version": "4.0.1", "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "versionFlexible":"false"}####
v: {
"display" : "Laboratory report",
"code" : "11502-2",
"system" : "http://loinc.org"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://loinc.org",
"code" : "11502-2"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"true"}####
v: {
"display" : "Laboratory report",
"code" : "11502-2",
"system" : "http://loinc.org"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://loinc.org",
"code" : "11502-2"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "Laboratory report",
"code" : "11502-2",
"system" : "http://loinc.org"
}
-------------------------------------------------------------------------------------
{"code" : { {"code" : {
"system" : "http://loinc.org", "system" : "http://loinc.org",
"code" : "60591-5" "code" : "60591-5"
@ -290,7 +330,7 @@ v: {
"code" : "51726-8", "code" : "51726-8",
"system" : "http://loinc.org", "system" : "http://loinc.org",
"severity" : "warning", "severity" : "warning",
"error" : "The display \"NDC labeler code request\" is not a valid display for the code {http://loinc.org}51726-8 - should be one of ['FDA product label NDC labeler code request', 'FDA label NDC labeler code request', 'FDA 药品标签 National Drug Code' (zh-CN), 'NDC' (zh-CN), '国家药品验证号' (zh-CN), '国家药品代码' (zh-CN), '美国国家药品代码' (zh-CN), '全国药品代码' (zh-CN), 'NDC labeler code' (zh-CN), 'NDC 标识者识别代码' (zh-CN), 'NDC 厂家号' (zh-CN), 'NDC 贴签厂商代码请求' (zh-CN), 'NDC 标签号申请 叙述' (zh-CN), '叙述性文字' (zh-CN), '报告' (zh-CN), '报告型' (zh-CN), '文字叙述' (zh-CN), '文本叙述型' (zh-CN), '文本描述' (zh-CN), '文本描述型 监管类文档' (zh-CN), 'Documentazione normativa Etichetta di prodotto della Food and Drug Administ' (it-IT), 'Описательный' (ru-RU)] (from http://tx.fhir.org/r4)" "error" : "The display \"NDC labeler code request\" is not a valid display for the code {http://loinc.org}51726-8 - should be one of ['FDA product label NDC labeler code request', 'FDA label NDC labeler code request', '', 'FDA 药品标签 National Drug Code' (zh-CN), 'NDC' (zh-CN), '国家药品验证号' (zh-CN), '国家药品代码' (zh-CN), '美国国家药品代码' (zh-CN), '全国药品代码' (zh-CN), 'NDC labeler code' (zh-CN), 'NDC 标识者识别代码' (zh-CN), 'NDC 厂家号' (zh-CN), 'NDC 贴签厂商代码请求' (zh-CN), 'NDC 标签号申请 叙述' (zh-CN), '叙述性文字' (zh-CN), '报告' (zh-CN), '报告型' (zh-CN), '文字叙述' (zh-CN), '文本叙述型' (zh-CN), '文本描述' (zh-CN), '文本描述型 监管类文档' (zh-CN), 'Documentazione normativa Etichetta di prodotto della Food and Drug Administ' (it-IT), 'Описательный' (ru-RU)] (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -365,7 +405,7 @@ v: {
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
"system" : "http://loinc.org", "system" : "http://loinc.org",
"version" : "2.71", "version" : "2.72",
"code" : "57852-6", "code" : "57852-6",
"display" : "Problem list Narrative - Reported" "display" : "Problem list Narrative - Reported"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
@ -1278,7 +1318,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Version 'http://loinc.org' of the code system 'http://loinc.org' is not known (encountered paired with code = 'test'). ValidVersions = [2.71]; The code provided (http://loinc.org#test) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)", "error" : "Version 'http://loinc.org' of the code system 'http://loinc.org' is not known (encountered paired with code = 'test'). ValidVersions = [2.72]; The code provided (http://loinc.org#test) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)",
"class" : "CODESYSTEM_UNSUPPORTED" "class" : "CODESYSTEM_UNSUPPORTED"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
@ -1292,55 +1332,3 @@ v: {
"system" : "http://loinc.org" "system" : "http://loinc.org"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : {
"system" : "http://loinc.org",
"code" : "11502-2"
}, "url": "http://hl7.org/fhir/ValueSet/doc-typecodes--0", "version": "4.0.1", "lang":"null", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "Laboratory report",
"code" : "11502-2",
"system" : "http://loinc.org"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://loinc.org",
"code" : "11502-2"
}, "url": "http://hl7.org/fhir/ValueSet/doc-typecodes", "version": "4.0.1", "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "versionFlexible":"false"}####
v: {
"display" : "Laboratory report",
"code" : "11502-2",
"system" : "http://loinc.org"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://loinc.org",
"code" : "11502-2"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"true"}####
v: {
"display" : "Laboratory report",
"code" : "11502-2",
"system" : "http://loinc.org"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://loinc.org",
"code" : "11502-2"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "Laboratory report",
"code" : "11502-2",
"system" : "http://loinc.org"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://loinc.org",
"version" : "2.72",
"code" : "57852-6",
"display" : "Problem list Narrative - Reported"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "Problem list Narrative - Reported",
"code" : "57852-6",
"system" : "http://loinc.org"
}
-------------------------------------------------------------------------------------

View File

@ -516,7 +516,7 @@ v: {
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
"system" : "http://snomed.info/sct", "system" : "http://snomed.info/sct",
"version" : "http://snomed.info/sct/900000000000207008/version/20210731", "version" : "http://snomed.info/sct/11000172109/version/20210915",
"code" : "271872005", "code" : "271872005",
"display" : "Old age (qualifier value)" "display" : "Old age (qualifier value)"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
@ -531,9 +531,8 @@ v: {
"code" : "271872005" "code" : "271872005"
}, "url": "https://fhir.kbv.de/ValueSet/KBV_VS_Base_Stage_Life--0", "version": "1.2.0", "lang":"null", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "url": "https://fhir.kbv.de/ValueSet/KBV_VS_Base_Stage_Life--0", "version": "1.2.0", "lang":"null", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"display" : "Old age (qualifier value)", "severity" : "error",
"code" : "271872005", "error" : "The code system \"http://snomed.info/sct\" in the include in \"https://fhir.kbv.de/ValueSet/KBV_VS_Base_Stage_Life--0\" is not known; The code provided (http://snomed.info/sct#271872005) is not valid (from http://tx.fhir.org/r4)"
"system" : "http://snomed.info/sct"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -579,7 +578,7 @@ v: {
"code" : "840535000", "code" : "840535000",
"system" : "http://snomed.info/sct", "system" : "http://snomed.info/sct",
"severity" : "warning", "severity" : "warning",
"error" : "The display \"COVID-19\" is not a valid display for the code {http://snomed.info/sct}840535000 - should be one of ['Antibody to 2019 novel coronavirus', 'Antibody to 2019-nCoV', 'Antibody to SARS-CoV-2', 'Antibody to Severe acute respiratory syndrome coronavirus 2 (substance)', 'Severe acute respiratory syndrome coronavirus 2 Ab', 'Antibody to Severe acute respiratory syndrome coronavirus 2', 'Severe acute respiratory syndrome coronavirus 2 antibody'] (from http://tx.fhir.org/r4)" "error" : "The display \"COVID-19\" is not a valid display for the code {http://snomed.info/sct}840535000 - should be one of ['Antibody to 2019 novel coronavirus', 'Antibody to 2019-nCoV', 'Antibody to severe acute respiratory syndrome coronavirus 2 (substance)', 'Antibody to severe acute respiratory syndrome coronavirus 2', 'Antibody to SARS-CoV-2', 'Severe acute respiratory syndrome coronavirus 2 Ab', 'Severe acute respiratory syndrome coronavirus 2 antibody'] (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -622,7 +621,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 10821000202101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"10821000202101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#10821000202101) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 10821000202101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"10821000202101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#10821000202101) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -656,7 +655,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 8921000202108 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"8921000202108\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8921000202108) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 8921000202108 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"8921000202108\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8921000202108) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -666,7 +665,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 8951000202101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"8951000202101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8951000202101) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 8951000202101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"8951000202101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8951000202101) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -687,7 +686,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 10291000202102 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"10291000202102\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#10291000202102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 10291000202102 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"10291000202102\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#10291000202102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -708,7 +707,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 8901000202102 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"8901000202102\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8901000202102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 8901000202102 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"8901000202102\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8901000202102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -729,7 +728,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 8911000202100 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"8911000202100\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8911000202100) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 8911000202100 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"8911000202100\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8911000202100) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -750,7 +749,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 8891000202103 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"8891000202103\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8891000202103) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 8891000202103 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"8891000202103\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8891000202103) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -811,7 +810,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 15991000202102 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"15991000202102\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#15991000202102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 15991000202102 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"15991000202102\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#15991000202102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -1252,7 +1251,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 10821000202101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"10821000202101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#10821000202101) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 10821000202101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"10821000202101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#10821000202101) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -1492,7 +1491,7 @@ v: {
}, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "versionFlexible":"false"}#### }, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 8921000202108 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"8921000202108\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8921000202108) is not valid in the value set 'No-procedure-performer-function' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 8921000202108 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"8921000202108\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8921000202108) is not valid in the value set 'No-procedure-performer-function' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -1501,7 +1500,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 8921000202108 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"8921000202108\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8921000202108) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 8921000202108 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"8921000202108\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8921000202108) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -1628,7 +1627,7 @@ v: {
}, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "versionFlexible":"false"}#### }, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 8951000202101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"8951000202101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8951000202101) is not valid in the value set 'No-procedure-performer-function' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 8951000202101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"8951000202101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8951000202101) is not valid in the value set 'No-procedure-performer-function' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -1637,7 +1636,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 8951000202101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"8951000202101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8951000202101) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 8951000202101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"8951000202101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8951000202101) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -1721,13 +1720,13 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Version 'http://snomed.info/sct/900000000000207008/version/20210331' of the code system 'http://snomed.info/sct' is not known (encountered paired with code = '459231000124102'). ValidVersions = [http://snomed.info/sct/11000146104/version/20210930,http://snomed.info/sct/11000172109/version/20210915,http://snomed.info/sct/20611000087101/version/20210930,http://snomed.info/sct/32506021000036107/version/20210630,http://snomed.info/sct/45991000052106/version/20210531,http://snomed.info/sct/554471000005108/version/20210930,http://snomed.info/sct/731000124108/version/20210901,http://snomed.info/sct/900000000000207008/version/20190731,http://snomed.info/sct/900000000000207008/version/20200131,http://snomed.info/sct/900000000000207008/version/20200731,http://snomed.info/sct/900000000000207008/version/20210731]; The code provided (http://snomed.info/sct#459231000124102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)", "error" : "Version 'http://snomed.info/sct/900000000000207008/version/20210331' of the code system 'http://snomed.info/sct' is not known (encountered paired with code = '459231000124102'). ValidVersions = [http://snomed.info/sct/11000146104/version/20210930,http://snomed.info/sct/11000172109/version/20210915,http://snomed.info/sct/20611000087101/version/20220331,http://snomed.info/sct/32506021000036107/version/20210630,http://snomed.info/sct/45991000052106/version/20210531,http://snomed.info/sct/554471000005108/version/20210930,http://snomed.info/sct/731000124108/version/20220301,http://snomed.info/sct/900000000000207008/version/20190731,http://snomed.info/sct/900000000000207008/version/20200131,http://snomed.info/sct/900000000000207008/version/20200731,http://snomed.info/sct/900000000000207008/version/20220131,http://snomed.info/sct/900000000000207008/version/20220331]; The code provided (http://snomed.info/sct#459231000124102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)",
"class" : "CODESYSTEM_UNSUPPORTED" "class" : "CODESYSTEM_UNSUPPORTED"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
"system" : "http://snomed.info/sct", "system" : "http://snomed.info/sct",
"version" : "http://snomed.info/sct/20611000087101/version/20210930", "version" : "http://snomed.info/sct/11000146104/version/20210930",
"code" : "36989005", "code" : "36989005",
"display" : "Mumps" "display" : "Mumps"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
@ -1767,7 +1766,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 35901911000001104 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"35901911000001104\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#35901911000001104) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 35901911000001104 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"35901911000001104\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#35901911000001104) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -1800,7 +1799,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}#### }, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 39695211000001102 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"39695211000001102\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#39695211000001102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 39695211000001102 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"39695211000001102\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#39695211000001102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -1809,7 +1808,7 @@ v: {
}, "valueSet" :null, "lang":"en-US", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"true"}#### }, "valueSet" :null, "lang":"en-US", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"true"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 1 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"1\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#1) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 1 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"1\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#1) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------
{"code" : { {"code" : {
@ -1818,50 +1817,6 @@ v: {
}, "valueSet" :null, "lang":"en-US", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"true"}#### }, "valueSet" :null, "lang":"en-US", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"true"}####
v: { v: {
"severity" : "error", "severity" : "error",
"error" : "Unable to find code 2 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"2\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#2) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)" "error" : "Unable to find code 2 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20220331); The code \"2\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#2) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://snomed.info/sct",
"code" : "10821000202101",
"display" : "Narkose eller dyp sedasjon med anestesistøtte"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"severity" : "error",
"error" : "Unable to find code 10821000202101 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"10821000202101\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#10821000202101) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://snomed.info/sct",
"code" : "8901000202102",
"display" : "Boston bowel preparation skala høyre kolon"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"severity" : "error",
"error" : "Unable to find code 8901000202102 in http://snomed.info/sct (version http://snomed.info/sct/900000000000207008/version/20210731); The code \"8901000202102\" is not valid in the system http://snomed.info/sct; The code provided (http://snomed.info/sct#8901000202102) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4)"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://snomed.info/sct",
"version" : "http://snomed.info/sct/11000172109/version/20210915",
"code" : "271872005",
"display" : "Old age (qualifier value)"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "Old age",
"code" : "271872005",
"system" : "http://snomed.info/sct"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://snomed.info/sct",
"version" : "http://snomed.info/sct/11000146104/version/20210930",
"code" : "36989005",
"display" : "Mumps"
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"display" : "Mumps",
"code" : "36989005",
"system" : "http://snomed.info/sct"
} }
------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------

View File

@ -8,11 +8,11 @@
"display" : "Subsetted" "display" : "Subsetted"
}] }]
}, },
"url" : "http://fhir.healthintersections.com.au/open/metadata", "url" : "http://tx.fhir.org/r4/metadata",
"version" : "4.0.1-2.0.12-SNAPSHOT", "version" : "4.0.1-2.0.14",
"name" : "FHIR Reference Server Conformance Statement", "name" : "FHIR Reference Server Conformance Statement",
"status" : "active", "status" : "active",
"date" : "2022-01-10T11:07:19.254Z", "date" : "2022-06-09T21:16:00.478Z",
"contact" : [{ "contact" : [{
"telecom" : [{ "telecom" : [{
"system" : "other", "system" : "other",
@ -23,8 +23,12 @@
"instantiates" : ["http://hl7.org/fhir/CapabilityStatement/terminology-server"], "instantiates" : ["http://hl7.org/fhir/CapabilityStatement/terminology-server"],
"software" : { "software" : {
"name" : "Reference Server", "name" : "Reference Server",
"version" : "2.0.12-SNAPSHOT", "version" : "2.0.14",
"releaseDate" : "2021-12-20T02:28:03.769Z" "releaseDate" : "2022-05-13T19:50:55.040Z"
},
"implementation" : {
"description" : "FHIR Server running at http://tx.fhir.org/r4",
"url" : "http://tx.fhir.org/r4"
}, },
"fhirVersion" : "4.0.1", "fhirVersion" : "4.0.1",
"format" : ["application/fhir+xml", "format" : ["application/fhir+xml",
@ -56,7 +60,7 @@
}, },
{ {
"name" : "versions", "name" : "versions",
"definition" : "/OperationDefinition/fso-versions" "definition" : "http://tx.fhir.org/r4/OperationDefinition/fso-versions"
}] }]
}] }]
} }

View File

@ -1,11 +1,11 @@
{ {
"resourceType" : "TerminologyCapabilities", "resourceType" : "TerminologyCapabilities",
"id" : "FhirServer", "id" : "FhirServer",
"url" : "http://fhir.healthintersections.com.au/open/metadata", "url" : "http://tx.fhir.org/r4/metadata",
"version" : "1.0.0", "version" : "1.0.0",
"name" : "FHIR Reference Server Teminology Capability Statement", "name" : "FHIR Reference Server Teminology Capability Statement",
"status" : "active", "status" : "active",
"date" : "2022-01-07T08:11:26.721Z", "date" : "2022-06-09T11:12:53.805Z",
"contact" : [{ "contact" : [{
"telecom" : [{ "telecom" : [{
"system" : "other", "system" : "other",
@ -832,9 +832,15 @@
{ {
"uri" : "http://hl7.org/fhir/us/core/CodeSystem/us-core-documentreference-category" "uri" : "http://hl7.org/fhir/us/core/CodeSystem/us-core-documentreference-category"
}, },
{
"uri" : "http://hl7.org/fhir/us/core/CodeSystem/us-core-observation-category"
},
{ {
"uri" : "http://hl7.org/fhir/us/core/CodeSystem/us-core-provenance-participant-type" "uri" : "http://hl7.org/fhir/us/core/CodeSystem/us-core-provenance-participant-type"
}, },
{
"uri" : "http://hl7.org/fhir/us/core/CodeSystem/us-core-tags"
},
{ {
"uri" : "http://hl7.org/fhir/variable-type" "uri" : "http://hl7.org/fhir/variable-type"
}, },

View File

@ -8,11 +8,11 @@
"display" : "Subsetted" "display" : "Subsetted"
}] }]
}, },
"url" : "http://fhir.healthintersections.com.au/open/metadata", "url" : "http://tx.fhir.org/r4/metadata",
"version" : "4.0.1-2.0.12-SNAPSHOT", "version" : "4.0.1-2.0.14",
"name" : "FHIR Reference Server Conformance Statement", "name" : "FHIR Reference Server Conformance Statement",
"status" : "active", "status" : "active",
"date" : "2022-01-10T11:07:19.254Z", "date" : "2022-06-09T21:12:46.775Z",
"contact" : [{ "contact" : [{
"telecom" : [{ "telecom" : [{
"system" : "other", "system" : "other",
@ -23,8 +23,12 @@
"instantiates" : ["http://hl7.org/fhir/CapabilityStatement/terminology-server"], "instantiates" : ["http://hl7.org/fhir/CapabilityStatement/terminology-server"],
"software" : { "software" : {
"name" : "Reference Server", "name" : "Reference Server",
"version" : "2.0.12-SNAPSHOT", "version" : "2.0.14",
"releaseDate" : "2021-12-20T02:28:03.769Z" "releaseDate" : "2022-05-13T19:50:55.040Z"
},
"implementation" : {
"description" : "FHIR Server running at http://tx.fhir.org/r4",
"url" : "http://tx.fhir.org/r4"
}, },
"fhirVersion" : "4.0.1", "fhirVersion" : "4.0.1",
"format" : ["application/fhir+xml", "format" : ["application/fhir+xml",
@ -56,7 +60,7 @@
}, },
{ {
"name" : "versions", "name" : "versions",
"definition" : "/OperationDefinition/fso-versions" "definition" : "http://tx.fhir.org/r4/OperationDefinition/fso-versions"
}] }]
}] }]
} }

Some files were not shown because too many files have changed in this diff Show More