From 9f70fd70b55942367bb124bb3e7dd25c68561697 Mon Sep 17 00:00:00 2001 From: Eric Murray Date: Tue, 16 Jun 2026 14:39:45 +0100 Subject: [PATCH 1/5] Make lastChecked property nullable and add examples --- code/API_definitions/device-identifier.yaml | 33 +++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/code/API_definitions/device-identifier.yaml b/code/API_definitions/device-identifier.yaml index 0ec551f..1b2451d 100644 --- a/code/API_definitions/device-identifier.yaml +++ b/code/API_definitions/device-identifier.yaml @@ -408,6 +408,15 @@ components: tac: "49015420" model: "3110" manufacturer: "Nokia" + Successful Identifier Retrieval With Null lastChecked Field: + description: Device identifier has been successfully retrieved but the API provider has no information on when that information was last confirmed to be correct + value: + lastChecked: null + imeisv: "4901542032375180" + imei: "490154203237518" + tac: "49015420" + model: "3110" + manufacturer: "Nokia" Successful Identifier Retrieval With Device Disambiguation: description: Device identifier has been successfully retrieved when a 2-legged access token and multiple device subscription identifiers were provided value: @@ -442,6 +451,13 @@ components: tac: "49015420" model: "3110" manufacturer: "Nokia" + Successful Type Retrieval With Null lastChecked Field: + description: Device identifier has been successfully retrieved but the API provider has no information on when that information was last confirmed to be correct + value: + lastChecked: null + tac: "49015420" + model: "3110" + manufacturer: "Nokia" Successful Type Retrieval With Device Disambiguation: description: Device type has been successfully retrieved when a 2-legged access token and multiple device subscription identifiers were provided value: @@ -472,6 +488,11 @@ components: value: lastChecked: "2024-02-20T10:41:38.657Z" ppid: "b083f65ccdad365d7489fff24b6d5074b30c12b6d81db3404d25964ffd908813" + Successful PPID Retrieval With Null lastChecked Field: + description: Device identifier has been successfully retrieved but the API provider has no information on when that information was last confirmed to be correct + value: + lastChecked: null + ppid: "b083f65ccdad365d7489fff24b6d5074b30c12b6d81db3404d25964ffd908813" Successful PPID Retrieval With Device Disambiguation: description: Device PPID has been successfully retrieved when a 2-legged access token and multiple device subscription identifiers were provided value: @@ -503,6 +524,11 @@ components: value: lastChecked: "2024-02-20T10:41:38.657Z" match: true + Successful Match With Null lastChecked Field: + description: Device identifier match has been successfully determined but the API provider has no information on when this information was last confirmed to be correct + value: + lastChecked: null + match: true Successful Non-Match: description: Device identifier does not match when the device subscription was identified by a 3-legged access token or single device subscription identifier value: @@ -648,8 +674,11 @@ components: lastChecked: description: | Date and time that the information was last confirmed by the mobile operator to be correct. It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) and must have time zone. - allOf: - - $ref: "../common/CAMARA_common.yaml#/components/schemas/DateTime" + type: string + format: date-time + maxLength: 64 + nullable: true + example: "2018-04-05T17:31:00Z" DeviceIdentifier: description: | From ad8fe332bf0959cd99088ea4309788ad37b022c7 Mon Sep 17 00:00:00 2001 From: Eric Murray Date: Thu, 30 Jul 2026 15:09:21 +0100 Subject: [PATCH 2/5] Allow lastChecked to be null or a past date-time --- .../device-identifier-matchIdentifier.feature | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/code/Test_definitions/device-identifier-matchIdentifier.feature b/code/Test_definitions/device-identifier-matchIdentifier.feature index 89e0603..d90999d 100644 --- a/code/Test_definitions/device-identifier-matchIdentifier.feature +++ b/code/Test_definitions/device-identifier-matchIdentifier.feature @@ -52,7 +52,7 @@ Feature: Camara Mobile Device Identifier API, vwip - Operation: matchIdentifier And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.match" exists and is true - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imei" does not exist And the response property "$.imeisv" does not exist And the response property "$.tac" does not exist @@ -78,7 +78,7 @@ Feature: Camara Mobile Device Identifier API, vwip - Operation: matchIdentifier And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.match" exists and is true - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imei" does not exist And the response property "$.imeisv" does not exist And the response property "$.tac" does not exist @@ -98,7 +98,7 @@ Feature: Camara Mobile Device Identifier API, vwip - Operation: matchIdentifier And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.match" exists and is false - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imei" does not exist And the response property "$.imeisv" does not exist And the response property "$.tac" does not exist @@ -119,7 +119,7 @@ Feature: Camara Mobile Device Identifier API, vwip - Operation: matchIdentifier And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.match" exists and is true - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imei" does not exist And the response property "$.imeisv" does not exist And the response property "$.tac" does not exist @@ -140,7 +140,7 @@ Feature: Camara Mobile Device Identifier API, vwip - Operation: matchIdentifier And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.match" exists and is false - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imei" does not exist And the response property "$.imeisv" does not exist And the response property "$.tac" does not exist @@ -162,7 +162,7 @@ Feature: Camara Mobile Device Identifier API, vwip - Operation: matchIdentifier And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.match" exists and is true - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imei" does not exist And the response property "$.imeisv" does not exist And the response property "$.tac" does not exist @@ -184,7 +184,7 @@ Feature: Camara Mobile Device Identifier API, vwip - Operation: matchIdentifier And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.match" exists and is false - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imei" does not exist And the response property "$.imeisv" does not exist And the response property "$.tac" does not exist @@ -204,7 +204,7 @@ Feature: Camara Mobile Device Identifier API, vwip - Operation: matchIdentifier And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.match" exists and is false - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imei" does not exist And the response property "$.imeisv" does not exist And the response property "$.tac" does not exist @@ -230,7 +230,7 @@ Feature: Camara Mobile Device Identifier API, vwip - Operation: matchIdentifier And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.match" exists and is true - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imei" does not exist And the response property "$.imeisv" does not exist And the response property "$.tac" does not exist @@ -256,7 +256,7 @@ Feature: Camara Mobile Device Identifier API, vwip - Operation: matchIdentifier And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.match" exists and is true - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imei" does not exist And the response property "$.imeisv" does not exist And the response property "$.tac" does not exist From 14da362903b0412994d6b0620c70631f78859b2f Mon Sep 17 00:00:00 2001 From: Eric Murray Date: Thu, 30 Jul 2026 15:10:01 +0100 Subject: [PATCH 3/5] Allow lastChecked to be null or a valid date-time --- .../device-identifier-retrieveIdentifier.feature | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/Test_definitions/device-identifier-retrieveIdentifier.feature b/code/Test_definitions/device-identifier-retrieveIdentifier.feature index cafa7c0..f988d03 100644 --- a/code/Test_definitions/device-identifier-retrieveIdentifier.feature +++ b/code/Test_definitions/device-identifier-retrieveIdentifier.feature @@ -51,7 +51,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrieveIdentifie And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.imei" exists and is equal to IMEI1 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imeisv", if present, is equal to IMEISV1 And the response property "$.tac", if present, is equal to TAC1 And the response property "$.manufacturer", if present, is equal to MANUFACTURER1 @@ -69,7 +69,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrieveIdentifie And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.imei" exists and is equal to IMEI1 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imeisv", if present, is equal to IMEISV1 And the response property "$.tac", if present, is equal to TAC1 And the response property "$.manufacturer", if present, is equal to MANUFACTURER1 @@ -88,7 +88,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrieveIdentifie And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.imei" exists and is equal to IMEI1 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imeisv", if present, is equal to IMEISV1 And the response property "$.tac", if present, is equal to TAC1 And the response property "$.manufacturer", if present, is equal to MANUFACTURER1 @@ -106,7 +106,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrieveIdentifie And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.imei" exists and is equal to IMEI1 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imeisv", if present, is equal to IMEISV1 And the response property "$.tac", if present, is equal to TAC1 And the response property "$.manufacturer", if present, is equal to MANUFACTURER1 @@ -124,7 +124,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrieveIdentifie And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.imei" exists and is equal to IMEI1 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imeisv", if present, is equal to IMEISV1 And the response property "$.tac", if present, is equal to TAC1 And the response property "$.manufacturer", if present, is equal to MANUFACTURER1 @@ -142,7 +142,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrieveIdentifie And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.imei" exists and is equal to IMEI2 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imeisv", if present, is equal to IMEISV2 And the response property "$.tac", if present, is equal to TAC2 And the response property "$.manufacturer", if present, is equal to MANUFACTURER2 @@ -160,7 +160,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrieveIdentifie And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.imei" exists and is equal to IMEI2 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.imeisv", if present, is equal to IMEISV2 And the response property "$.tac", if present, is equal to TAC2 And the response property "$.manufacturer", if present, is equal to MANUFACTURER2 From e33a24a30250c43e03a25b3c4836e365916a5434 Mon Sep 17 00:00:00 2001 From: Eric Murray Date: Thu, 30 Jul 2026 15:10:55 +0100 Subject: [PATCH 4/5] Update lastChecked property validation in feature file to allow null --- .../device-identifier-retrievePpid.feature | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/Test_definitions/device-identifier-retrievePpid.feature b/code/Test_definitions/device-identifier-retrievePpid.feature index d039f6e..a4cf72c 100644 --- a/code/Test_definitions/device-identifier-retrievePpid.feature +++ b/code/Test_definitions/device-identifier-retrievePpid.feature @@ -53,7 +53,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrievePpid And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.ppid" exists and is equal to PPID1 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null # This scenario is only valid for 2-legged access tokens @DeviceIdentifier_retrievePpid_200.02_success_scenario_2-legged_token_identifying_device_by_phone_number @@ -67,7 +67,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrievePpid And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.ppid" exists and is equal to PPID1 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null # This scenario is only valid for 2-legged access tokens @DeviceIdentifier_retrievePpid_200.03_success_scenario_2-legged_token_identifying_device_by_IPv4_address @@ -82,7 +82,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrievePpid And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.ppid" exists and is equal to PPID1 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null # This scenario is only valid for 3-legged access tokens @DeviceIdentifier_retrievePpid_200.04_success_scenario_3-legged_token_after_SIM_card_swap @@ -96,7 +96,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrievePpid And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.ppid" exists and is equal to PPID1 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null # This scenario is only valid for 2-legged access tokens @DeviceIdentifier_retrievePpid_200.05_success_scenario_2-legged_token_after_SIM_card_swap @@ -110,7 +110,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrievePpid And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.ppid" exists and is equal to PPID1 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null # This scenario is only valid for 3-legged access tokens @DeviceIdentifier_retrievePpid_200.06_success_scenario_3-legged_token_after_device_swap @@ -124,7 +124,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrievePpid And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.ppid" exists and is equal to PPID2 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null # This scenario is only valid for 2-legged access tokens @DeviceIdentifier_retrievePpid_200.07_success_scenario_2-legged_token_after_device_swap @@ -138,7 +138,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrievePpid And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.ppid" exists and is equal to PPID2 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null # Generic 400 errors From 5ac5e50a1afff853a214c5676ca91c10adf86788 Mon Sep 17 00:00:00 2001 From: Eric Murray Date: Thu, 30 Jul 2026 15:11:45 +0100 Subject: [PATCH 5/5] Allow lastChecked to be null in response validation --- .../device-identifier-retrieveType.feature | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/Test_definitions/device-identifier-retrieveType.feature b/code/Test_definitions/device-identifier-retrieveType.feature index 76bafad..fea4016 100644 --- a/code/Test_definitions/device-identifier-retrieveType.feature +++ b/code/Test_definitions/device-identifier-retrieveType.feature @@ -51,7 +51,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrieveType And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.tac" exists and is equal to TAC1 - And the response property "$.lastChecked" exists and is either a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.manufacturer", if present, is equal to MANUFACTURER1 And the response property "$.model", if present, is equal to MODEL1 @@ -67,7 +67,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrieveType And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.tac" exists and is equal to TAC1 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.manufacturer", if present, is equal to MANUFACTURER1 And the response property "$.model", if present, is equal to MODEL1 @@ -84,7 +84,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrieveType And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.tac" exists and is equal to TAC1 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.manufacturer", if present, is equal to MANUFACTURER1 And the response property "$.model", if present, is equal to MODEL1 @@ -100,7 +100,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrieveType And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.tac" exists and is equal to TAC1 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.manufacturer", if present, is equal to MANUFACTURER1 And the response property "$.model", if present, is equal to MODEL1 @@ -116,7 +116,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrieveType And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.tac" exists and is equal to TAC1 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.manufacturer", if present, is equal to MANUFACTURER1 And the response property "$.model", if present, is equal to MODEL1 @@ -132,7 +132,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrieveType And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.tac" exists and is equal to TAC2 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.manufacturer", if present, is equal to MANUFACTURER2 And the response property "$.model", if present, is equal to MODEL2 @@ -148,7 +148,7 @@ Feature: Camara Mobile Device Identifer API, vwip - Operation: retrieveType And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.tac" exists and is equal to TAC2 - And the response property "$.lastChecked" exists and is a valid date-time in the past + And the response property "$.lastChecked" exists and is either a valid date-time in the past, or is null And the response property "$.manufacturer", if present, is equal to MANUFACTURER2 And the response property "$.model", if present, is equal to MODEL2