Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
/**/node_modules
/**/.vscode
.idea
36 changes: 36 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# HISTORY
## sdmx-tck-modules v4.8.0 (2024-12-05)
- Introduce structure tests to support multiple values for AGENCY, ID and VERSION, using the OR separator.
- Handle Geospatial specialised code lists (i.e., GeographicCodelist and GeoGridCodelist) when parsing codelists.
- Support parameter value ancestors for the `references` parameter.

## sdmx-tck-modules v4.7.0 (2024-03-26)

### Details
- Adapt the existing tests and introduce new ones within the "Structure Further Describing Results Parameters" category that work with REST api version 2.0.

## sdmx-tck-modules v4.6.0 (2024-03-07)

### Details

- Adjust data extended identification tests to support REST 2.0 and SDMX 3.0. Added support for many keys using filters for dimension values.

- Introduced key identifier for tests because the existing URL used as identifier was not sufficient to describe the same test for different REST api versions.

- Minor fix in the creation of testId for data availability tests.

- Organised unit tests for SDMX-ML structure parsers.

- Added fix for <code>/hierarchicalcodelist/agency/id/version/items</code> test, as proposed by Oleksandr Buhaiov (buhaiovos)). The test was failing because hierarchies were not parsed and the code was not able to select the two hierarchies required by the specific test in order to run.

- Fix handling of 406 response code for represenation tests with invalid/not supported represenation type (fix proposed by Oleksandr Buhaiov (buhaiovos)).

- Fixed a bug in handling of 'structure' request type parameter. The process of randomly selecting a structure based on its type was not suitable for the 'structure' resource and has been appropriately addressed.

- Resolved a bug affecting the semantic checking of structure identification tests specifically when the requested REST resource is 'structure'.

## sdmx-tck-modules v4.5.0 (2024-02-22)

### Details

//TODO
89 changes: 89 additions & 0 deletions Diagrams/StructureTestExecutionManager_SequenceDiagram.pu
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
@startuml StrcuctureTestExecutionManager_SequenceDiagram

skinparam sequence {
' ArrowColor DeepSkyBlue
' ActorBorderColor DeepSkyBlue
LifeLineBorderColor blue
LifeLineBackgroundColor #A9DCDF
ParticipantBorderColor DeepSkyBlue
ParticipantBackgroundColor #cfe4ff
ParticipantFontName Consolas
ParticipantFontSize 14
' ParticipantFontColor #A9DCDF
' ActorBackgroundColor aqua
' ActorFontColor #A9DCDF
ActorFontSize 14
ActorFontName Consolas
}
actor User as u
participant "StructureTestExecutionManager" as STM
participant "StructureRequestBuilder" as SRB
box sdmx-rest4js
participant "UrlGenerator" as UG
participant "sdmx_requestor" as SR
end box
participant "ResponseValidator" as RV
participant "SdmxXmlParser" as SXP
participant "SemanticCheckerFactory" as SCF

u -> STM: executeTest(test, apiVersion, endpoint)
activate STM
' alt testType = STRUCTURE_REFERENCE_PARTIAL
' STM -> STM: identifiers = ContentConstraintTypeValidator.getContentConstraintOfAllowedType(toRun)
' end

' TODO: prepareRequest to be further broken down.
STM -> SRB: prepareRequest(endpoint, apiVersion, resource, ...)
activate SRB
SRB --> STM: preparedRequest
deactivate SRB

STM -> UG: getUrl(query, service, skipDefaults=true)
activate UG
UG --> STM: url
deactivate UG

STM -> SR: request2(url, preparedRequest.headers)
activate SR
SR --> STM: httpResponse
deactivate SR

group HTTP Validation
' validateHttpResponse to be further broken down
STM -> RV: validateHttpResponse(preparedRequest.request, httpResponse)
activate RV
RV --> STM: HTTP Validation outcome
deactivate RV
break HTTP Validation failed
STM --> STM: throw TckError("HTTP validation failed")
end

alt testType == 'Structure Query Representation'
STM -> RV: validateRepresentation(representation, httpResponse, apiVersion)
activate RV
RV --> STM: HTTP Validation outcome
deactivate RV
break Validation failed
STM --> STM: throw TckError("HTTP validation failed")
end
STM --> u: Test Results
end
end

STM -> SXP: getIMObjects(httpResponse, apiVersion)
activate SXP
SXP --> STM: workspace
deactivate SXP

group Workspace Validation
STM -> SCF: getChecker(test).checkWorkspace(test, preparedRequest, workspace)
activate SCF
SCF --> STM: workspaceValidation
deactivate SCF
break Workspace Validation Failed
STM --> STM: throw TckError("Workspace validation failed")
end
end
STM --> u: Test Results
deactivate STM
@enduml
209 changes: 209 additions & 0 deletions Diagrams/TCKManager_PackageDiagram.pu
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
@startuml "TCKManager_PackageDiagram"

component sdmx-tck-manager as sdmx_tck_manager #ddd {
package "Package manager" as manager #fff {
left to right direction
class TestExecutionManagerFactory {
+ getTestsManager(index) : TestExecutionManager
}
class StructureTestExecutionManager {
+ executeTest(test, apiVersion, endpoint): Promise
}
class SchemaTestExecutionManager {
+ executeTest(test, apiVersion, endpoint): Promise
}
class DataTestsExecutionManager {
+ executeTest(test, apiVersion, endpoint): Promise
}
}
' Relationships
TestExecutionManagerFactory --> StructureTestExecutionManager : <<returns>>
TestExecutionManagerFactory --> SchemaTestExecutionManager : <<returns>>
TestExecutionManagerFactory --> DataTestsExecutionManager : <<returns>>
}

newpage
component sdmx-tck-manager #ddd {
' skinparam linetype ortho
skinparam linetype polyline
skinparam SameClassWidth true
left to right direction

package "Package checker" as checker #fff {
class SemanticCheckerFactory {
+ getChecker(test): SemanticChecker
}
class DataSemanticChecker {
+ checkWorkspace(test, request, workspace): Promise
- _checkResourceIdentification(test, query, workspace) : Object
- _checkProviderIdentification(test, query, workspace) : Object
- _checkIdentification(test, query, workspace) : Object
- _checkExtendedResourceIdentification(test, query, workspace) : Object
- _validateSeriesAgainstKey(test, query, workspace) : Object
- _checkFurtherDescribingResults(test, query, workspace) : Object
- _checkDimensionAtObservation(test, query, workspace) : Object
- _validateAttributesPositioning(workspace, test) : Object
- _validateDimAtObsTimePeriod(workspace) : Object
- _validateDimAtObsDimension(workspace, dimensionAtObservationId) : Object
- _validateDimAtObsAllDimensions(workspace) : Object
- _validateDimAtObsNotProvided(workspace, test) : Object
- _checkDetail(test, workspace) : Object
- _checkPeriods(periods, workspace) : Object
- _checkObservations(test, query, workspace) : Object
- _checkDataAvailability(test, query, workspace) : Object
- _checkModeExact(test, query, constraint) : Object
- _checkModeAvailable(test, query, constraint) : Object
- _checkTemporalCoverage(test, constraint) : Object
- _checkMetrics(constraint) : Object
- _checkSingleDimension(test, query, constraint) : Object
- _checkReferences(test, query, workspace, constraint) : Object
- _checkReferencedDSD(test, query, workspace, constraint) : Object
- _checkReferencedDF(test, query, workspace, constraint) : Object
- _checkReferencedCodelists(test, workspace, constraint) : Object
- _findNotUsedCodes(allCodes, keyValues) : Array
- _findParents(codelistCodes, code, parents) : Array
- _checkReferencedConceptSchemes(test, query, workspace, constraint) : Object
- _checkReferencedProviderScheme(test, query, workspace) : Object
- _checkAllReferences(test, query, workspace, constraint) : Object
}
class SchemasSemanticChecker {
+ checkWorkspace(test, request, workspace): Promise
- checkXSDComponents(test, query, workspace) :
- checkDefaultRules(dsdObject, workspace, dimensionAtObservation) : Object
- checkXSDSimpleTypes(test, query, dsdObject, workspace) : Object
- checkXSDSimpleTypesWithoutEnums(dsdObject, workspace) : Object
- checkXSDSimpleTypesWithEnums(test, query, dsdObject, workspace) : Object
- validateKeyValueAgainstSimpleTypeEnum(workspace, keyValue, constraintObj) : Object
- checkXSDComplexTypes(test, dsdObject, query, workspace, dimensionAtObservation) : Object
- checkXSDDataSetType(test, dsdObject, workspace, dimensionAtObservation) : Object
- checkXSDSeriesType(test, dsdObject, workspace, dimensionAtObservation) : Object
- checkXSDGroupType(test, dsdObject, workspace, dimensionAtObservation) : Object
- checkXSDAbstractGroupType(dsdObject, workspace) : Object
- checkSimpleTypeGroupID(dsdObject, workspace) : Object
- checkSpecificXSDGroupType(test, dsdObject, workspace) : Object
- checkXSDObsType(test, dsdObject, query, sdmxObjects, dimensionAtObservation) : Object
- checkObsTypeContentModel(test, dsdObject, query, sdmxObjects, dimensionAtObservation) : Object
- checkComplexTypesOfMeasureDimensionConcepts(test, dsdObject, sdmxObjects) : Object
}
class ContentConstraintReferencePartialChecker {
+ checkWorkspace(test, request, workspace): Promise
- getDataFromConstraint(workspace, constraint) : Object
- constraintValuesValidation(keyValue, codesArray, constraint) : boolean
- checkReferencePartialTestWorkspace(workspace, keyValueData, codeListRef, constraint) : Object
- getDsdFromConstrainable(workspace, constrainableArtefactRef) : Object
- referencepartialTestBuilder(test, constrainable) : Object
- getRefOfSpecificStructureType(childrenRefs, structureType) : StructureReference
}
class StructuresSemanticChecker {
+ checkWorkspace(test, request, workspace) : Promise
+ checkIdentification(query, workspace) : Object
- _exactlyOneArtefactWithCorrectNumOfItems(workspace, structureType, ...) : Object
- _exactlyOneArtefact(workspace, structureType, agencyId, id, version) : Object
- _atLeastOneArtefact(workspace, structureType, agencyId, id, version) : object
+ checkReferences(query, workspace) : object
- _getParents(workspace, structureObject, structureRef) : Array
- _getParentsSiblings(workspace, structureObject, structureRef) : Array
- _getChildren(workspace, structureObject) : Array
- _getDescendants(workspace, structureObject) : Array
- _getAll(workspace, structureObject, structureRef) : Array
- _getParentsChildren(workspace, structureObject, structureRef) : Array
+ checkDetails(query, workspace) : Object
- _checkIfPartial(structureRef, itemScheme) : boolean
+ checkTargetCategory(query, workspace) : Object
- _checkCategorisationIds(workspace, item) : Object
}
class HttpResponseValidator {
+ validateHttpResponse(query, httpResponse) : Promise
+ validateRepresentation(requestedRepresentation, response, apiVersion) : Promise
- checkEmptyRepresentationTestResponse(response) : Void
- validateOtherHeaders(template, response) : Object
- checkCompression(response) : Void
- checkCaching(response) : Void
}
class ContentConstraintTypeValidator {
+ getContentConstraintOfAllowedType(test) : Object
+ changeContentConstraintIfNeeded(test,parentWorkspaceObj) : Object
}
' Relationships
SemanticCheckerFactory --> StructuresSemanticChecker : <<returns>>
SemanticCheckerFactory --> ContentConstraintReferencePartialChecker : <<returns>>
SemanticCheckerFactory --> SchemasSemanticChecker : <<returns>>
SemanticCheckerFactory --> DataSemanticChecker : <<returns>>
' Hidden Relationships
StructuresSemanticChecker -[hidden]- HttpResponseValidator
StructuresSemanticChecker -[hidden]- ContentConstraintTypeValidator
}
}
newpage
component sdmx-tck-manager #ddd {
' This class diagram contains the classes of checker package but without private methods.
' skinparam linetype ortho
skinparam linetype polyline
skinparam SameClassWidth true
left to right direction

package "Package checker" as checker #fff {
class SemanticCheckerFactory {
+ getChecker(test): SemanticChecker
}
class DataSemanticChecker {
+ checkWorkspace(test, request, workspace): Promise
}
class SchemasSemanticChecker {
+ checkWorkspace(test, request, workspace): Promise
}
class ContentConstraintReferencePartialChecker {
+ checkWorkspace(test, request, workspace): Promise
}
class StructuresSemanticChecker {
+ checkWorkspace(test, request, workspace) : Promise
}
class HttpResponseValidator {
+ validateHttpResponse(query, httpResponse) : Promise
+ validateRepresentation(requestedRepresentation, response, apiVersion) : Promise
}
class ContentConstraintTypeValidator {
+ getContentConstraintOfAllowedType(test) : Object
}
' Relationships
SemanticCheckerFactory --> StructuresSemanticChecker : <<returns>>
SemanticCheckerFactory --> ContentConstraintReferencePartialChecker : <<returns>>
SemanticCheckerFactory --> SchemasSemanticChecker : <<returns>>
SemanticCheckerFactory --> DataSemanticChecker : <<returns>>
' Hidden Relationships
StructuresSemanticChecker -[hidden]- HttpResponseValidator
StructuresSemanticChecker -[hidden]- ContentConstraintTypeValidator
}
}

' package "Package builders" as builders #fff {
' left to right direction
' class TestsModelBuilder {

' }
' package "Package data-queries-builders" as data_queries_builders #fff {
' class DataAvailabilityTestBuilder {
' + getTests(index, x, apiVersion): []
' }
' class DataExtendedResourceIdentificationTestBuilder {
' + getTests(index, x, apiVersion): []
' }
' class DataFurtherDescribingResultsTestBuilder {
' + getTests(index, x, apiVersion): []
' }
' class DataIdentificationParametersTestBuilder {
' + getTests(index, x, apiVersion): []
' }
' class DataOtherFeatureTestBuilder {
' + getTests(index, x, apiVersion): []
' }
' package "Package schema-queries-builders" as schema_queries_builders #fff {

' }
' package "Package structure-queries-builders" as structure_queries_builders #fff {

' }
' }
'manager -[hidden]right--- checker

@enduml
33 changes: 0 additions & 33 deletions Dockerfile

This file was deleted.

Loading
Loading