From a51102bd77465a85e41069d9c0f067adbe51f379 Mon Sep 17 00:00:00 2001 From: Renu Kumari Date: Mon, 6 Dec 2021 12:37:10 -0500 Subject: Upgrade event schema to support delete operation Issue-ID: CPS-789 Signed-off-by: Renu Kumari Change-Id: I2625f0cc068618bea820ad9503ee75c5a7ae4c5f --- .../schemas/cps-data-updated-event-schema.json | 14 ++++-- .../onap/cps/event/CpsDataUpdatedEventSpec.groovy | 58 +++++++++++++++++----- .../src/test/resources/bookstore-chapters.json | 34 ------------- cps-events/src/test/resources/event-v1.json | 34 +++++++++++++ .../test/resources/event-v2-create-operation.json | 36 ++++++++++++++ .../test/resources/event-v2-delete-operation.json | 13 +++++ .../event-v2-with-additional-properties.json | 36 ++++++++++++++ 7 files changed, 173 insertions(+), 52 deletions(-) delete mode 100644 cps-events/src/test/resources/bookstore-chapters.json create mode 100644 cps-events/src/test/resources/event-v1.json create mode 100644 cps-events/src/test/resources/event-v2-create-operation.json create mode 100644 cps-events/src/test/resources/event-v2-delete-operation.json create mode 100644 cps-events/src/test/resources/event-v2-with-additional-properties.json (limited to 'cps-events/src') diff --git a/cps-events/src/main/resources/schemas/cps-data-updated-event-schema.json b/cps-events/src/main/resources/schemas/cps-data-updated-event-schema.json index 95dc605da4..3c95664d7a 100644 --- a/cps-events/src/main/resources/schemas/cps-data-updated-event-schema.json +++ b/cps-events/src/main/resources/schemas/cps-data-updated-event-schema.json @@ -1,7 +1,7 @@ { "$schema": "https://json-schema.org/draft/2019-09/schema", - "$id": "urn:cps:org.onap.cps:data-updated-event-schema:v1", + "$id": "urn:cps:org.onap.cps:data-updated-event-schema:v2", "$ref": "#/definitions/CpsDataUpdatedEvent", @@ -40,7 +40,7 @@ "type", "content" ], - "additionalProperties": false + "additionalProperties": true }, "Content": { @@ -63,6 +63,11 @@ "description": "The name of CPS Core anchor the data is attached to.", "type": "string" }, + "operation": { + "description": "The operation on the data", + "type": "string", + "enum": ["CREATE", "UPDATE", "DELETE"] + }, "data": { "$ref": "#/definitions/Data" } @@ -71,10 +76,9 @@ "observedTimestamp", "dataspaceName", "schemaSetName", - "anchorName", - "data" + "anchorName" ], - "additionalProperties": false + "additionalProperties": true }, "Data": { diff --git a/cps-events/src/test/groovy/org/onap/cps/event/CpsDataUpdatedEventSpec.groovy b/cps-events/src/test/groovy/org/onap/cps/event/CpsDataUpdatedEventSpec.groovy index 545b183378..aac0b5aba9 100644 --- a/cps-events/src/test/groovy/org/onap/cps/event/CpsDataUpdatedEventSpec.groovy +++ b/cps-events/src/test/groovy/org/onap/cps/event/CpsDataUpdatedEventSpec.groovy @@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode import org.onap.cps.event.model.Content import org.onap.cps.event.model.CpsDataUpdatedEvent import org.onap.cps.event.model.Data +import spock.lang.Shared import spock.lang.Specification /** @@ -39,8 +40,10 @@ class CpsDataUpdatedEventSpec extends Specification { final EVENT_ID = '77b8f114-4562-4069-8234-6d059ff742ac' final EVENT_SOURCE = new URI('urn:cps:org.onap.cps') final EVENT_TYPE = 'org.onap.cps.data-updated-event' - final EVENT_SCHEMA = new URI('urn:cps:org.onap.cps:data-updated-event-schema:v1') + final EVENT_SCHEMA_V1 = new URI('urn:cps:org.onap.cps:data-updated-event-schema:v1') + final EVENT_SCHEMA_V2 = new URI('urn:cps:org.onap.cps:data-updated-event-schema:v2') + @Shared final DATA = [ 'test:bookstore': [ 'bookstore-name': 'Chapters', @@ -60,14 +63,14 @@ class CpsDataUpdatedEventSpec extends Specification { ] ] - def 'Conversion from JSON String to CpsDataUpdatedEvent POJO.'() { - when: 'event JSON String is converted to CpsDataUpdatedEvent' - def notificationMessage = getEventAsJsonStringFromFile() + def 'Conversion from Event V1 JSON String to CpsDataUpdatedEvent POJO.'() { + when: 'event V1 JSON String is converted to CpsDataUpdatedEvent' + def notificationMessage = getEventAsJsonStringFromFile('/event-v1.json') def cpsDataUpdatedEvent = objectMapper.readValue(notificationMessage, CpsDataUpdatedEvent.class) then: 'CpsDataUpdatedEvent POJO has the excepted values' cpsDataUpdatedEvent.id == EVENT_ID cpsDataUpdatedEvent.source == EVENT_SOURCE - cpsDataUpdatedEvent.schema == EVENT_SCHEMA + cpsDataUpdatedEvent.schema == EVENT_SCHEMA_V1 cpsDataUpdatedEvent.type == EVENT_TYPE def content = cpsDataUpdatedEvent.content content.observedTimestamp == EVENT_TIMESTAMP @@ -77,8 +80,37 @@ class CpsDataUpdatedEventSpec extends Specification { content.data.getAdditionalProperties() == DATA } - def 'Conversion CpsDataUpdatedEvent POJO to JSON String.'() { - given: 'Event content with the Data' + def 'Conversion from Event V2 JSON String to CpsDataUpdatedEvent POJO'() { + when: 'event V2 JSON String is converted to CpsDataUpdatedEvent' + def notificationMessage = getEventAsJsonStringFromFile(inputEventJson) + def cpsDataUpdatedEvent = objectMapper.readValue(notificationMessage, CpsDataUpdatedEvent.class) + then: 'CpsDataUpdatedEvent POJO has the excepted values' + with(cpsDataUpdatedEvent) { + id == EVENT_ID + source == EVENT_SOURCE + schema == EVENT_SCHEMA_V2 + type == EVENT_TYPE + } + with(cpsDataUpdatedEvent.content) { + observedTimestamp == EVENT_TIMESTAMP + dataspaceName == DATASPACE_NAME + schemaSetName == BOOKSTORE_SCHEMA_SET + anchorName == ANCHOR_NAME + operation == expectedOperation + if (expectedData != null) + data.getAdditionalProperties() == expectedData + else + data == null + } + where: + scenario | inputEventJson || expectedData | expectedOperation + 'create operation' | '/event-v2-create-operation.json' || DATA | Content.Operation.CREATE + 'delete operation' | '/event-v2-delete-operation.json' || null | Content.Operation.DELETE + 'create with additional fields' | '/event-v2-with-additional-properties.json' || DATA | Content.Operation.CREATE + } + + def 'Conversion from CpsDataUpdatedEvent POJO to Event V2 JSON String.'() { + given: 'Event V2 content with the Data' def data = new Data() data.withAdditionalProperty('test:bookstore', DATA.'test:bookstore') def content = new Content() @@ -86,28 +118,28 @@ class CpsDataUpdatedEventSpec extends Specification { .withDataspaceName(DATASPACE_NAME) .withSchemaSetName(BOOKSTORE_SCHEMA_SET) .withObservedTimestamp(EVENT_TIMESTAMP) + .withOperation(Content.Operation.CREATE) .withData(data) and: 'CpsDataUpdatedEvent with the content' def cpsDataUpdateEvent = new CpsDataUpdatedEvent() cpsDataUpdateEvent - .withSchema(EVENT_SCHEMA) + .withSchema(EVENT_SCHEMA_V2) .withId(EVENT_ID) .withSource(EVENT_SOURCE) .withType(EVENT_TYPE) .withContent(content) - when: 'CpsDataUpdatedEvent is converted to JSON string' + when: 'CpsDataUpdatedEvent is converted to Event V2 JSON string' def actualMessage = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(cpsDataUpdateEvent) then: 'the created JSON String is same as the expected JSON String' - def expectedMessage = getEventAsJsonStringFromFile() + def expectedMessage = getEventAsJsonStringFromFile('/event-v2-create-operation.json') assert actualMessage == expectedMessage } - def getEventAsJsonStringFromFile() { + def getEventAsJsonStringFromFile(String fileName) { return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString( objectMapper.readValue( - this.class.getResource('/bookstore-chapters.json').getText('UTF-8'), + this.class.getResource(fileName).getText('UTF-8'), ObjectNode.class) ) } - } diff --git a/cps-events/src/test/resources/bookstore-chapters.json b/cps-events/src/test/resources/bookstore-chapters.json deleted file mode 100644 index 753426a60a..0000000000 --- a/cps-events/src/test/resources/bookstore-chapters.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "schema": "urn:cps:org.onap.cps:data-updated-event-schema:v1", - "id": "77b8f114-4562-4069-8234-6d059ff742ac", - "source": "urn:cps:org.onap.cps", - "type": "org.onap.cps.data-updated-event", - "content": { - "observedTimestamp": "2020-12-01T00:00:00.000+0000", - "dataspaceName": "my-dataspace", - "schemaSetName": "bookstore-schemaset", - "anchorName": "chapters", - "data": { - "test:bookstore":{ - "bookstore-name": "Chapters", - "categories": [ - { - "code": "01", - "name": "SciFi", - "books": [ - { - "authors": [ - "Iain M. Banks" - ], - "lang": "en", - "price": 895, - "pub_year": "1994", - "title": "Feersum Endjinn" - } - ] - } - ] - } - } - } -} diff --git a/cps-events/src/test/resources/event-v1.json b/cps-events/src/test/resources/event-v1.json new file mode 100644 index 0000000000..753426a60a --- /dev/null +++ b/cps-events/src/test/resources/event-v1.json @@ -0,0 +1,34 @@ +{ + "schema": "urn:cps:org.onap.cps:data-updated-event-schema:v1", + "id": "77b8f114-4562-4069-8234-6d059ff742ac", + "source": "urn:cps:org.onap.cps", + "type": "org.onap.cps.data-updated-event", + "content": { + "observedTimestamp": "2020-12-01T00:00:00.000+0000", + "dataspaceName": "my-dataspace", + "schemaSetName": "bookstore-schemaset", + "anchorName": "chapters", + "data": { + "test:bookstore":{ + "bookstore-name": "Chapters", + "categories": [ + { + "code": "01", + "name": "SciFi", + "books": [ + { + "authors": [ + "Iain M. Banks" + ], + "lang": "en", + "price": 895, + "pub_year": "1994", + "title": "Feersum Endjinn" + } + ] + } + ] + } + } + } +} diff --git a/cps-events/src/test/resources/event-v2-create-operation.json b/cps-events/src/test/resources/event-v2-create-operation.json new file mode 100644 index 0000000000..92ecab34f9 --- /dev/null +++ b/cps-events/src/test/resources/event-v2-create-operation.json @@ -0,0 +1,36 @@ +{ + "schema": "urn:cps:org.onap.cps:data-updated-event-schema:v2", + "id": "77b8f114-4562-4069-8234-6d059ff742ac", + "source": "urn:cps:org.onap.cps", + "type": "org.onap.cps.data-updated-event", + "content": { + "observedTimestamp": "2020-12-01T00:00:00.000+0000", + "dataspaceName": "my-dataspace", + "schemaSetName": "bookstore-schemaset", + "anchorName": "chapters", + "operation" : "CREATE", + "data": { + "test:bookstore":{ + "bookstore-name": "Chapters", + "categories": [ + { + "code": "01", + "name": "SciFi", + "books": [ + { + "authors": [ + "Iain M. Banks" + ], + "lang": "en", + "price": 895, + "pub_year": "1994", + "title": "Feersum Endjinn" + } + ] + } + ] + } + } + } +} + diff --git a/cps-events/src/test/resources/event-v2-delete-operation.json b/cps-events/src/test/resources/event-v2-delete-operation.json new file mode 100644 index 0000000000..e003088bff --- /dev/null +++ b/cps-events/src/test/resources/event-v2-delete-operation.json @@ -0,0 +1,13 @@ +{ + "schema": "urn:cps:org.onap.cps:data-updated-event-schema:v2", + "id": "77b8f114-4562-4069-8234-6d059ff742ac", + "source": "urn:cps:org.onap.cps", + "type": "org.onap.cps.data-updated-event", + "content": { + "observedTimestamp": "2020-12-01T00:00:00.000+0000", + "dataspaceName": "my-dataspace", + "schemaSetName": "bookstore-schemaset", + "anchorName": "chapters", + "operation" : "DELETE" + } +} \ No newline at end of file diff --git a/cps-events/src/test/resources/event-v2-with-additional-properties.json b/cps-events/src/test/resources/event-v2-with-additional-properties.json new file mode 100644 index 0000000000..4e2db6898e --- /dev/null +++ b/cps-events/src/test/resources/event-v2-with-additional-properties.json @@ -0,0 +1,36 @@ +{ + "schema": "urn:cps:org.onap.cps:data-updated-event-schema:v2", + "id": "77b8f114-4562-4069-8234-6d059ff742ac", + "source": "urn:cps:org.onap.cps", + "type": "org.onap.cps.data-updated-event", + "content": { + "observedTimestamp": "2020-12-01T00:00:00.000+0000", + "dataspaceName": "my-dataspace", + "schemaSetName": "bookstore-schemaset", + "anchorName": "chapters", + "operation" : "CREATE", + "additionalField" : "value", + "data": { + "test:bookstore":{ + "bookstore-name": "Chapters", + "categories": [ + { + "code": "01", + "name": "SciFi", + "books": [ + { + "authors": [ + "Iain M. Banks" + ], + "lang": "en", + "price": 895, + "pub_year": "1994", + "title": "Feersum Endjinn" + } + ] + } + ] + } + } + } +} -- cgit 1.2.3-korg