import Foundation import Testing @testable import PediFoods private func decode(_ type: T.Type, _ json: String) throws -> T { try JSONDecoder().decode(T.self, from: Data(json.utf8)) } @Test("CreateOrderResult decodes paymentPayload when it's a nested object") func createOrderResultPaymentPayloadAsObject() throws { let json = #"{"id":"1","paymentPayload":{"copyPaste":"00020126","qrCodeImage":"base64img","expirationDate":"2026-01-01"}}"# let result = try decode(CreateOrderResult.self, json) #expect(result.paymentPayload?.copyPaste == "00020126") #expect(result.paymentPayload?.qrCodeImage == "base64img") } @Test("CreateOrderResult wraps a bare-string paymentPayload into copyPaste") func createOrderResultPaymentPayloadAsBareString() throws { let json = #"{"id":"1","paymentPayload":"00020126"}"# let result = try decode(CreateOrderResult.self, json) #expect(result.paymentPayload?.copyPaste == "00020126") #expect(result.paymentPayload?.qrCodeImage == nil) } @Test("CreateOrderResult leaves paymentPayload nil when the field is absent") func createOrderResultPaymentPayloadAbsent() throws { let result = try decode(CreateOrderResult.self, #"{"id":"1"}"#) #expect(result.paymentPayload == nil) } @Test("CreateOrderPaymentPayload falls back from copyPaste to the legacy payload key") func createOrderPaymentPayloadCopyPasteKeyFallback() throws { let payload = try decode(CreateOrderPaymentPayload.self, #"{"payload":"00020126"}"#) #expect(payload.copyPaste == "00020126") } @Test("CreateOrderPaymentPayload falls back from qrCodeImage to the legacy encodedImage key") func createOrderPaymentPayloadQrCodeImageKeyFallback() throws { let payload = try decode(CreateOrderPaymentPayload.self, #"{"encodedImage":"base64img"}"#) #expect(payload.qrCodeImage == "base64img") } @Test("ValidateDeliveryAddressResult reads camelCase or snake_case keys interchangeably") func validateDeliveryAddressResultKeyFallback() throws { let camelCase = try decode(ValidateDeliveryAddressResult.self, #"{"deliveryAllowed":true,"reasonCode":"OUT_OF_RANGE"}"#) #expect(camelCase.deliveryAllowed == true) #expect(camelCase.reasonCode == "OUT_OF_RANGE") let snakeCase = try decode(ValidateDeliveryAddressResult.self, #"{"delivery_allowed":false,"reason_code":"OUT_OF_RANGE"}"#) #expect(snakeCase.deliveryAllowed == false) #expect(snakeCase.reasonCode == "OUT_OF_RANGE") } @Test("ValidateDeliveryAddressResult resolves deliveryFee from any of its three key names") func validateDeliveryAddressResultDeliveryFeeThreeWayFallback() throws { let viaDeliveryFee = try decode(ValidateDeliveryAddressResult.self, #"{"deliveryFee":5.5}"#) #expect(viaDeliveryFee.deliveryFee == 5.5) let viaFee = try decode(ValidateDeliveryAddressResult.self, #"{"fee":6.5}"#) #expect(viaFee.deliveryFee == 6.5) let viaTaxa = try decode(ValidateDeliveryAddressResult.self, #"{"taxa":"7,50"}"#) #expect(viaTaxa.deliveryFee == 7.5) } @Test("ValidateDeliveryAddressResult defaults every field to nil on an empty payload") func validateDeliveryAddressResultEmptyPayload() throws { let result = try decode(ValidateDeliveryAddressResult.self, "{}") #expect(result.deliveryAllowed == nil) #expect(result.reasonCode == nil) #expect(result.deliveryFee == nil) #expect(result.sameCity == nil) }