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.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
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.npm.FilesystemPackageCacheManager;
import org.hl7.fhir.utilities.npm.ToolsVersion;
import org.hl7.fhir.utilities.tests.ResourceLoaderTests;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
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 null;
}
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 {
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();
gql.getOutput().setWriteWrapper(false);
gql.getOutput().write(str, 0);
TextFile.stringToFile(str.toString(), TestingUtilities.resourceNameToFile("graphql", output + ".out"));
msg = TestingUtilities.checkJsonIsSame(TestingUtilities.resourceNameToFile("graphql", output + ".out"), TestingUtilities.resourceNameToFile("graphql", output));
String actualFilePath = TestingUtilities.generateResourcePath("graphql", output + ".out");
TextFile.stringToFile(str.toString(), actualFilePath);
msg = TestingUtilities.checkJsonIsSame(actualFilePath, TestingUtilities.resourceNameToFile("graphql", output));
Assertions.assertTrue(Utilities.noString(msg), msg);
} else
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.XhtmlComposer;
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.Test;
import org.xmlpull.v1.XmlPullParserException;
@ -74,13 +76,13 @@ public class NarrativeGeneratorTests {
DateTimeType dt = new DateTimeType(src);
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");
new DataRenderer(rc).render(node, dt);
actual = new XhtmlComposer(true, false).compose(node);
Assert.assertTrue(actual.startsWith("<p>"));
Assert.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(actual.startsWith("<p>"));
assertTrue(actual.endsWith("</p>"));
assertTrue(Utilities.existsInList(actual.substring(0, actual.length()-4).substring(3), expected), "Actual = "+actual+", expected one of "+Utilities.toString(expected));
}
@Test

View File

@ -20,7 +20,7 @@
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-base</artifactId>
<exclusions>
<exclusion>
@ -146,6 +146,16 @@
<scope>test</scope>
</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 -->
<dependency>
@ -160,16 +170,6 @@
<version>${junit_jupiter_version}</version>
<scope>test</scope>
</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>
<build>
@ -192,4 +192,4 @@
</resources>
</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.ToolsVersion;
import org.hl7.fhir.utilities.tests.BaseTestingUtilities;
import org.hl7.fhir.utilities.tests.TestConfig;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
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 {
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);
return swc;
}
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);
return swc;
}

View File

@ -7,10 +7,10 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@ -19,6 +19,7 @@ import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import org.apache.commons.io.IOUtils;
import org.hl7.fhir.r5.formats.IParser;
import org.hl7.fhir.r5.model.CanonicalResource;
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.ValueSet;
import org.hl7.fhir.r5.terminologies.ValueSetExpander;
import org.hl7.fhir.utilities.tests.ResourceLoaderTests;
import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.junit.jupiter.api.Test;
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.JsonParser;
public class TerminologyCacheTests {
public class TerminologyCacheTests implements ResourceLoaderTests {
static final ValueSet.ConceptSetComponent include = new ValueSet.ConceptSetComponent();
static {
@ -59,8 +61,9 @@ public class TerminologyCacheTests {
private JsonParser jsonParser = new JsonParser();
private JsonElement getJsonFromFile(String filename) throws URISyntaxException, IOException {
final Path path = Paths.get("src","test","resources", "context", filename);
final String stringValue = new String ( Files.readAllBytes(path));
InputStream inputStream = getResourceAsInputStream("context", filename);
final String stringValue = IOUtils.toString(inputStream, java.nio.charset.StandardCharsets.UTF_8);
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.hl7.fhir.utilities.tests.ResourceLoaderTests;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
@ -16,16 +16,15 @@ import java.util.stream.Stream;
import static org.junit.Assert.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
public class CompareUtilitiesTest {
public static final Path ROOT_TEST_PATH = Paths.get("src","test","resources", "testUtilities");
public class CompareUtilitiesTests implements ResourceLoaderTests {
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_JSON_TEST_PATH = ROOT_TEST_PATH.resolve("json");
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);
return contents.trim();
}
@ -52,15 +51,20 @@ public class CompareUtilitiesTest {
@ParameterizedTest
@MethodSource("getCompareXMLParams")
public void testCompareXML(String expectedFileName, String actualFileName, String expectedOutputFileName) throws Exception {
final String expectedXMLPath = ROOT_XML_TEST_PATH.resolve(expectedFileName).toAbsolutePath().toString();
final String actualXMLPath = ROOT_XML_TEST_PATH.resolve(actualFileName).toAbsolutePath().toString();
final String expectedXMLPath = ROOT_XML_TEST_PATH.resolve(expectedFileName).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) {
assertNull(actualOutput);
} 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));
assertEquals(expectedOutput, normalizeNewlines(actualOutput));
}
@ -84,14 +88,14 @@ public class CompareUtilitiesTest {
@ParameterizedTest
@MethodSource("getCompareJSONParams")
public void testCompareJSON(String expectedFileName, String actualFileName, String expectedOutputFileName) throws IOException {
final String expectedJSONPath = ROOT_JSON_TEST_PATH.resolve(expectedFileName).toAbsolutePath().toString();
final String actualJSONPath = ROOT_JSON_TEST_PATH.resolve(actualFileName).toAbsolutePath().toString();
final String expectedJSONPath = ROOT_JSON_TEST_PATH.resolve(expectedFileName).toString();
final String actualJSONPath = ROOT_JSON_TEST_PATH.resolve(actualFileName).toString();
final String actualOutput = CompareUtilities.checkJsonSrcIsSame(getResourceAsString(expectedJSONPath), getResourceAsString(actualJSONPath), false);
if (expectedOutputFileName == null) {
assertNull(actualOutput);
} 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));
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>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit_jupiter_version}</version>
<scope>test</scope>
<scope>provided</scope>
</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>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<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>
<groupId>org.hl7.fhir.testcases</groupId>
<artifactId>fhir-test-cases</artifactId>
<version>${validator_test_case_version}</version>
<scope>test</scope>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>provided</scope>
</dependency>
<!--
<dependency>
<groupId>com.squareup.okhttp3</groupId>

View File

@ -7,13 +7,12 @@ import org.hl7.fhir.utilities.ToolGlobalSettings;
import org.hl7.fhir.utilities.Utilities;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class BaseTestingUtilities {
static public boolean silent;
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
@ -24,7 +23,7 @@ public class BaseTestingUtilities {
* 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()) {
dir = ToolGlobalSettings.getTestsPath();
}
@ -48,7 +47,7 @@ public class BaseTestingUtilities {
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()) {
dir = ToolGlobalSettings.getTestsPath();
}
@ -66,7 +65,7 @@ public class BaseTestingUtilities {
}
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()) {
dir = ToolGlobalSettings.getTestsPath();
}
@ -84,7 +83,7 @@ public class BaseTestingUtilities {
}
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()) {
dir = ToolGlobalSettings.getTestsPath();
}
@ -112,4 +111,7 @@ public class BaseTestingUtilities {
Utilities.createDirectory(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 static final String FHIR_TXCACHE_REBUILD = "fhir.txcache.rebuild";
public static final String isRebuildingCache = System.getProperty(FHIR_TXCACHE_REBUILD);
@Getter
int requests = 0;
@Override
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(method);
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() {
if (isRebuildingCache()) {
if (TestConfig.getInstance().isRebuildCache()) {
return true;
} else {
if (requests != 0) {
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;
} else {
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;
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_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.JsonObject;
import org.hl7.fhir.utilities.tests.ResourceLoaderTests;
import org.junit.jupiter.api.DisplayName;
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.Path;
import java.nio.file.Paths;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class PackageClientTest {
public class PackageClientTest implements ResourceLoaderTests {
PackageClient packageClient = new PackageClient(PackageClient.PRIMARY_SERVER);
@ -26,8 +31,8 @@ public class PackageClientTest {
@Test
@DisplayName("test getting package from JSON works")
public void getPackageInfoFromJSONTest() throws java.io.IOException{
final JsonObject jsonObject = new Gson().fromJson(Files.newBufferedReader(Paths.get("src", "test", "resources", "npm", "PackageClient-baseTestCase.json")), JsonObject.class);
public void getPackageInfoFromJSONTest() throws java.io.IOException, URISyntaxException {
final JsonObject jsonObject = new Gson().fromJson(new InputStreamReader(getResourceAsInputStream("npm","PackageClient-baseTestCase.json")), JsonObject.class);
final PackageInfo packageInfo = packageClient.getPackageInfoFromJSON(jsonObject, null, null, null);
assertExpectedFields(packageInfo);
@ -36,7 +41,7 @@ public class PackageClientTest {
@Test
@DisplayName("test getting package from JSON works")
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);
assertExpectedFields(packageInfo);

View File

@ -1,24 +1,35 @@
package org.hl7.fhir.utilities.tests;
import java.io.FileOutputStream;
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.transform.TransformerException;
import org.apache.commons.io.IOUtils;
import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.utilities.xls.XLSXmlNormaliser;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.xml.sax.SAXException;
public class XLSXmlNormaliserTests {
public class XLSXmlNormaliserTests implements ResourceLoaderTests {
@Test
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 = 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);
}
}

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>
</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
org.hl7.fhir.utilities (and others) but are required for the CLI to work,
@ -63,7 +284,7 @@
<plugins>
<!--
Build a fatjar containing all depenedncies
Build a fatjar containing all dependencies
-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
@ -94,6 +315,7 @@
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathLayoutType>repository</classpathLayoutType>
<mainClass>org.hl7.fhir.validation.ValidatorCli</mainClass>
</manifest>
</archive>
@ -180,7 +402,7 @@
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
<skipStaging>true</skipStaging>
</configuration>
</plugin>
<plugin>

View File

@ -25,6 +25,24 @@
<artifactId>org.hl7.fhir.utilities</artifactId>
</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 -->
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
@ -46,6 +64,11 @@
<artifactId>org.hl7.fhir.r4</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.r5</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>org.hl7.fhir.convertors</artifactId>
@ -197,7 +220,11 @@
<artifactId>thymeleaf</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
<!-- JUnit Jupiter -->
<dependency>
<groupId>org.junit.jupiter</groupId>
@ -205,12 +232,7 @@
<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.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
@ -223,6 +245,28 @@
<optional>true</optional>
<scope>test</scope>
</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 -->
<dependency>
<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.ValidationService;
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.net.Authenticator;
@ -152,20 +154,36 @@ public class ValidatorCli {
CliContext cliContext = Params.loadCliContext(args);
if (Params.hasParam(args, Params.TEST)) {
Common.runValidationEngineTests();
} else if (shouldDisplayHelpToUser(args)) {
if (shouldDisplayHelpToUser(args)) {
Display.displayHelpDetails();
} else if (Params.hasParam(args, Params.COMPARE)) {
if (destinationDirectoryValid(Params.getParam(args, Params.DESTINATION))) {
doLeftRightComparison(args, cliContext, tt);
}
} else {
} else if (Params.hasParam(args, Params.TEST)) {
parseTestParamsAndExecute(args);
}
else {
Display.printCliArgumentsAndInfo(args);
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) {
// 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<>();

View File

@ -66,18 +66,6 @@ public class Common {
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.
*/

View File

@ -10,5 +10,6 @@ public enum EngineMode {
CONVERT,
SPREADSHEET,
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";
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.
*
@ -208,6 +214,9 @@ public class Params {
cliContext.setMode(EngineMode.SPREADSHEET);
} else if (args[i].equals(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)) {
cliContext.setSecurityChecks(true);
} 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;
import org.apache.commons.io.Charsets;
import org.apache.commons.io.IOUtils;
import org.hl7.fhir.r5.elementmodel.Manager;
import org.hl7.fhir.validation.ValidationEngine;
import org.hl7.fhir.validation.cli.model.CliContext;
import org.hl7.fhir.validation.cli.model.FileInfo;
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.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentMatchers;
import org.mockito.Mockito;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import static org.hl7.fhir.validation.tests.utilities.TestUtilities.getTerminologyCacheDirectory;
import static org.junit.jupiter.api.Assertions.*;
class ValidationServiceTest {
@ -36,7 +31,7 @@ class ValidationServiceTest {
List<FileInfo> filesToValidate = new ArrayList<>();
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
myService.validateSources(request);
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.validation.IgLoader;
import org.hl7.fhir.validation.ValidationEngine;
import org.junit.Test;
import org.junit.jupiter.api.Test;
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.test.utils.TestingUtilities;
import org.hl7.fhir.validation.NativeHostServices;
import org.hl7.fhir.validation.tests.utilities.TestConstants;
import org.junit.jupiter.api.Test;
import java.nio.file.Paths;
import static org.hl7.fhir.validation.tests.utilities.TestUtilities.getTerminologyCacheDirectory;
public class NativeHostServiceTester {
@ -16,7 +15,7 @@ public class NativeHostServiceTester {
NativeHostServices svc = new NativeHostServices();
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());
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.tests.CacheVerificationLogger;
import org.hl7.fhir.validation.tests.utilities.TestConstants;
import org.hl7.fhir.r5.elementmodel.Manager.FhirFormat;
import org.hl7.fhir.r5.model.OperationOutcome;
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.utilities.FhirPublication;
import org.hl7.fhir.utilities.tests.TestConfig;
import org.hl7.fhir.utilities.tests.TestConstants;
import org.hl7.fhir.validation.ValidationEngine;
import java.nio.file.Paths;
@ -16,7 +18,7 @@ public class TestUtilities {
.withCanRunWithoutTerminologyServer(canRunWithoutTerminologyServer)
.withVersion(vString)
.withUserAgent(TestConstants.USER_AGENT)
.withTerminologyCachePath(Paths.get(TestConstants.TX_CACHE, vString).toString())
.withTerminologyCachePath(getTerminologyCacheDirectory(vString))
.withTxServer(txServer, txLog, version)
.fromSource(src);
@ -24,11 +26,15 @@ public class TestUtilities {
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 {
final ValidationEngine validationEngine = new ValidationEngine.ValidationEngineBuilder()
.withVersion(vString)
.withUserAgent(TestConstants.USER_AGENT)
.withTerminologyCachePath(Paths.get(TestConstants.TX_CACHE, vString).toString())
.withTerminologyCachePath(getTerminologyCacheDirectory(vString))
.withTxServer(txServer, TestConstants.TX_CACHE_LOG, version)
.fromSource(src);
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",
"valueCode" : "both"
}],
"url" : "http://fhir.healthintersections.com.au/open/metadata",
"version" : "1.0.2-2.0.12-SNAPSHOT",
"url" : "http://tx.fhir.org/r2/metadata",
"version" : "1.0.2-2.0.14",
"name" : "FHIR Reference Server Conformance Statement",
"status" : "active",
"date" : "2022-01-06T15:44:28.286Z",
"date" : "2022-06-09T21:15:44.743Z",
"contact" : [{
"telecom" : [{
"system" : "other",
@ -27,8 +27,12 @@
"kind" : "instance",
"software" : {
"name" : "Reference Server",
"version" : "2.0.12-SNAPSHOT",
"releaseDate" : "2021-12-20T02:28:03.769Z"
"version" : "2.0.14",
"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",
"format" : ["application/xml+fhir",

View File

@ -12,11 +12,11 @@
"url" : "http://hl7.org/fhir/3.0/StructureDefinition/extension-CapabilityStatement.acceptUnknown",
"valueCode" : "both"
}],
"url" : "http://fhir.healthintersections.com.au/open/metadata",
"version" : "3.0.2-2.0.12-SNAPSHOT",
"url" : "http://tx.fhir.org/r3/metadata",
"version" : "3.0.2-2.0.14",
"name" : "FHIR Reference Server Conformance Statement",
"status" : "active",
"date" : "2022-01-10T11:02:52.097Z",
"date" : "2022-06-09T21:14:05.196Z",
"contact" : [{
"telecom" : [{
"system" : "other",
@ -27,8 +27,12 @@
"instantiates" : ["http://hl7.org/fhir/CapabilityStatement/terminology-server"],
"software" : {
"name" : "Reference Server",
"version" : "2.0.12-SNAPSHOT",
"releaseDate" : "2021-12-20T02:28:03.769Z"
"version" : "2.0.14",
"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",
"format" : ["application/fhir+xml",
@ -60,7 +64,7 @@
},
{
"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",
"valueCode" : "both"
}],
"url" : "http://fhir.healthintersections.com.au/open/metadata",
"version" : "3.0.2-2.0.12-SNAPSHOT",
"url" : "http://tx.fhir.org/r3/metadata",
"version" : "3.0.2-2.0.14",
"name" : "FHIR Reference Server Conformance Statement",
"status" : "active",
"date" : "2022-01-10T11:02:52.097Z",
"date" : "2022-06-09T21:13:00.228Z",
"contact" : [{
"telecom" : [{
"system" : "other",
@ -27,8 +27,12 @@
"instantiates" : ["http://hl7.org/fhir/CapabilityStatement/terminology-server"],
"software" : {
"name" : "Reference Server",
"version" : "2.0.12-SNAPSHOT",
"releaseDate" : "2021-12-20T02:28:03.769Z"
"version" : "2.0.14",
"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",
"format" : ["application/fhir+xml",
@ -60,7 +64,7 @@
},
{
"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",
"system" : "http://loinc.org",
"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" : {
@ -245,7 +245,7 @@ v: {
"code" : "18776-5",
"system" : "http://loinc.org",
"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" : {
@ -280,7 +280,7 @@ v: {
"code" : "10187-3",
"system" : "http://loinc.org",
"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" : {

View File

@ -130,7 +130,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -140,7 +140,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -150,7 +150,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -160,7 +160,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -170,7 +170,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -180,7 +180,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -190,7 +190,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -200,7 +200,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -210,7 +210,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -220,7 +220,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -230,7 +230,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -240,7 +240,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -250,7 +250,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -260,7 +260,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -270,7 +270,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -332,6 +332,15 @@ v: {
"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" : {
"system" : "http://snomed.info/sct",
"code" : "27113001",
@ -343,12 +352,3 @@ v: {
"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"
}]
},
"url" : "http://fhir.healthintersections.com.au/open/metadata",
"version" : "4.0.1-2.0.12-SNAPSHOT",
"url" : "http://tx.fhir.org/r4/metadata",
"version" : "4.0.1-2.0.14",
"name" : "FHIR Reference Server Conformance Statement",
"status" : "active",
"date" : "2022-01-10T11:07:19.254Z",
"date" : "2022-06-09T21:09:34.321Z",
"contact" : [{
"telecom" : [{
"system" : "other",
@ -23,8 +23,12 @@
"instantiates" : ["http://hl7.org/fhir/CapabilityStatement/terminology-server"],
"software" : {
"name" : "Reference Server",
"version" : "2.0.12-SNAPSHOT",
"releaseDate" : "2021-12-20T02:28:03.769Z"
"version" : "2.0.14",
"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",
"format" : ["application/fhir+xml",
@ -56,7 +60,7 @@
},
{
"name" : "versions",
"definition" : "/OperationDefinition/fso-versions"
"definition" : "http://tx.fhir.org/r4/OperationDefinition/fso-versions"
}]
}]
}

View File

@ -1,11 +1,11 @@
{
"resourceType" : "TerminologyCapabilities",
"id" : "FhirServer",
"url" : "http://fhir.healthintersections.com.au/open/metadata",
"url" : "http://tx.fhir.org/r4/metadata",
"version" : "1.0.0",
"name" : "FHIR Reference Server Teminology Capability Statement",
"status" : "active",
"date" : "2022-01-07T08:11:26.721Z",
"date" : "2022-06-09T11:12:53.805Z",
"contact" : [{
"telecom" : [{
"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-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-tags"
},
{
"uri" : "http://hl7.org/fhir/variable-type"
},

View File

@ -36,7 +36,7 @@ v: {
"code" : "59284-0",
"system" : "http://loinc.org",
"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" : {
@ -153,6 +153,15 @@ v: {
"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" : "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"}####
@ -828,7 +837,7 @@ v: {
}, "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)"
"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" : {
@ -1533,78 +1542,3 @@ v: {
"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"
}
-------------------------------------------------------------------------------------
{"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",
"code" : "60591-5"
@ -290,7 +330,7 @@ v: {
"code" : "51726-8",
"system" : "http://loinc.org",
"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" : {
@ -365,7 +405,7 @@ v: {
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://loinc.org",
"version" : "2.71",
"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"}####
@ -1278,7 +1318,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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"
}
-------------------------------------------------------------------------------------
@ -1292,55 +1332,3 @@ v: {
"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" : {
"system" : "http://snomed.info/sct",
"version" : "http://snomed.info/sct/900000000000207008/version/20210731",
"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"}####
@ -531,9 +531,8 @@ v: {
"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"}####
v: {
"display" : "Old age (qualifier value)",
"code" : "271872005",
"system" : "http://snomed.info/sct"
"severity" : "error",
"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)"
}
-------------------------------------------------------------------------------------
{"code" : {
@ -579,7 +578,7 @@ v: {
"code" : "840535000",
"system" : "http://snomed.info/sct",
"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" : {
@ -622,7 +621,7 @@ v: {
}, "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)"
"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" : {
@ -656,7 +655,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -666,7 +665,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -687,7 +686,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -708,7 +707,7 @@ v: {
}, "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)"
"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" : {
@ -729,7 +728,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -750,7 +749,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -811,7 +810,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -1252,7 +1251,7 @@ v: {
}, "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)"
"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" : {
@ -1492,7 +1491,7 @@ v: {
}, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "versionFlexible":"false"}####
v: {
"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" : {
@ -1501,7 +1500,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -1628,7 +1627,7 @@ v: {
}, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "versionFlexible":"false"}####
v: {
"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" : {
@ -1637,7 +1636,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -1721,13 +1720,13 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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"
}
-------------------------------------------------------------------------------------
{"code" : {
"system" : "http://snomed.info/sct",
"version" : "http://snomed.info/sct/20611000087101/version/20210930",
"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"}####
@ -1767,7 +1766,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -1800,7 +1799,7 @@ v: {
}, "valueSet" :null, "lang":"null", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"false"}####
v: {
"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" : {
@ -1809,7 +1808,7 @@ v: {
}, "valueSet" :null, "lang":"en-US", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"true"}####
v: {
"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" : {
@ -1818,50 +1817,6 @@ v: {
}, "valueSet" :null, "lang":"en-US", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "versionFlexible":"true"}####
v: {
"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)"
}
-------------------------------------------------------------------------------------
{"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"
"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)"
}
-------------------------------------------------------------------------------------

View File

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

View File

@ -1,11 +1,11 @@
{
"resourceType" : "TerminologyCapabilities",
"id" : "FhirServer",
"url" : "http://fhir.healthintersections.com.au/open/metadata",
"url" : "http://tx.fhir.org/r4/metadata",
"version" : "1.0.0",
"name" : "FHIR Reference Server Teminology Capability Statement",
"status" : "active",
"date" : "2022-01-07T08:11:26.721Z",
"date" : "2022-06-09T11:12:53.805Z",
"contact" : [{
"telecom" : [{
"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-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-tags"
},
{
"uri" : "http://hl7.org/fhir/variable-type"
},

View File

@ -8,11 +8,11 @@
"display" : "Subsetted"
}]
},
"url" : "http://fhir.healthintersections.com.au/open/metadata",
"version" : "4.0.1-2.0.12-SNAPSHOT",
"url" : "http://tx.fhir.org/r4/metadata",
"version" : "4.0.1-2.0.14",
"name" : "FHIR Reference Server Conformance Statement",
"status" : "active",
"date" : "2022-01-10T11:07:19.254Z",
"date" : "2022-06-09T21:12:46.775Z",
"contact" : [{
"telecom" : [{
"system" : "other",
@ -23,8 +23,12 @@
"instantiates" : ["http://hl7.org/fhir/CapabilityStatement/terminology-server"],
"software" : {
"name" : "Reference Server",
"version" : "2.0.12-SNAPSHOT",
"releaseDate" : "2021-12-20T02:28:03.769Z"
"version" : "2.0.14",
"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",
"format" : ["application/fhir+xml",
@ -56,7 +60,7 @@
},
{
"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