{
  "contract": "checkout-frame-message-v1",
  "synthetic": true,
  "normalisation": "one payment id and one origin throughout; each accepted vector names the page root the server renders (its data-futa attributes) and the event, and its message is what the built emitter posts for them (tests/frame-messages.test.mjs); each refused one is a message the schema refuses",
  "vectors": [
    {
      "case": "frame: ready, from any page of the payment, its chooser included",
      "valid": true,
      "root": {
        "data-futa-embedding": "frame",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-origin": "https://shop.example"
      },
      "event": "ready",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "ready",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f"
      }
    },
    {
      "case": "app: ready, from any page of the payment, its chooser included",
      "valid": true,
      "root": {
        "data-futa-embedding": "app",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f"
      },
      "event": "ready",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "ready",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f"
      }
    },
    {
      "case": "frame: CK1 to CK3, CK9 and CK10's states before a choice",
      "valid": true,
      "root": {
        "data-futa-embedding": "frame",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-origin": "https://shop.example",
        "data-futa-state": "CREATED",
        "data-futa-final": "false"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "CREATED",
        "final": false
      }
    },
    {
      "case": "frame: CK4, or CK3 and CKD once the bank admitted the payment",
      "valid": true,
      "root": {
        "data-futa-embedding": "frame",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-origin": "https://shop.example",
        "data-futa-state": "PENDING_APPROVAL",
        "data-futa-final": "false"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "PENDING_APPROVAL",
        "final": false
      }
    },
    {
      "case": "frame: CK8",
      "valid": true,
      "root": {
        "data-futa-embedding": "frame",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-origin": "https://shop.example",
        "data-futa-state": "UNCERTAIN",
        "data-futa-final": "false"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "UNCERTAIN",
        "final": false
      }
    },
    {
      "case": "frame: CK5",
      "valid": true,
      "root": {
        "data-futa-embedding": "frame",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-origin": "https://shop.example",
        "data-futa-state": "APPROVED",
        "data-futa-final": "true"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true
      }
    },
    {
      "case": "frame: CK6 with nothing offered or left to check",
      "valid": true,
      "root": {
        "data-futa-embedding": "frame",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-origin": "https://shop.example",
        "data-futa-state": "DECLINED",
        "data-futa-final": "true"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "DECLINED",
        "final": true
      }
    },
    {
      "case": "frame: CK6 offering a replacement, or telling the payer to check before paying again",
      "valid": true,
      "root": {
        "data-futa-embedding": "frame",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-origin": "https://shop.example",
        "data-futa-state": "DECLINED",
        "data-futa-final": "false"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "DECLINED",
        "final": false
      }
    },
    {
      "case": "frame: CK7 with nothing left to check",
      "valid": true,
      "root": {
        "data-futa-embedding": "frame",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-origin": "https://shop.example",
        "data-futa-state": "EXPIRED",
        "data-futa-final": "true"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "EXPIRED",
        "final": true
      }
    },
    {
      "case": "frame: CK7 telling the payer to check before paying again",
      "valid": true,
      "root": {
        "data-futa-embedding": "frame",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-origin": "https://shop.example",
        "data-futa-state": "EXPIRED",
        "data-futa-final": "false"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "EXPIRED",
        "final": false
      }
    },
    {
      "case": "frame: a cancelled attempt with nothing left to check",
      "valid": true,
      "root": {
        "data-futa-embedding": "frame",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-origin": "https://shop.example",
        "data-futa-state": "CANCELLED",
        "data-futa-final": "true"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "CANCELLED",
        "final": true
      }
    },
    {
      "case": "app: CK1 to CK3, CK9 and CK10's states before a choice",
      "valid": true,
      "root": {
        "data-futa-embedding": "app",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-state": "CREATED",
        "data-futa-final": "false"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "CREATED",
        "final": false
      }
    },
    {
      "case": "app: CK4, or CK3 and CKD once the bank admitted the payment",
      "valid": true,
      "root": {
        "data-futa-embedding": "app",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-state": "PENDING_APPROVAL",
        "data-futa-final": "false"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "PENDING_APPROVAL",
        "final": false
      }
    },
    {
      "case": "app: CK8",
      "valid": true,
      "root": {
        "data-futa-embedding": "app",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-state": "UNCERTAIN",
        "data-futa-final": "false"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "UNCERTAIN",
        "final": false
      }
    },
    {
      "case": "app: CK5",
      "valid": true,
      "root": {
        "data-futa-embedding": "app",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-state": "APPROVED",
        "data-futa-final": "true"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true
      }
    },
    {
      "case": "app: CK6 with nothing offered or left to check",
      "valid": true,
      "root": {
        "data-futa-embedding": "app",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-state": "DECLINED",
        "data-futa-final": "true"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "DECLINED",
        "final": true
      }
    },
    {
      "case": "app: CK6 offering a replacement, or telling the payer to check before paying again",
      "valid": true,
      "root": {
        "data-futa-embedding": "app",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-state": "DECLINED",
        "data-futa-final": "false"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "DECLINED",
        "final": false
      }
    },
    {
      "case": "app: CK7 with nothing left to check",
      "valid": true,
      "root": {
        "data-futa-embedding": "app",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-state": "EXPIRED",
        "data-futa-final": "true"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "EXPIRED",
        "final": true
      }
    },
    {
      "case": "app: CK7 telling the payer to check before paying again",
      "valid": true,
      "root": {
        "data-futa-embedding": "app",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-state": "EXPIRED",
        "data-futa-final": "false"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "EXPIRED",
        "final": false
      }
    },
    {
      "case": "app: a cancelled attempt with nothing left to check",
      "valid": true,
      "root": {
        "data-futa-embedding": "app",
        "data-futa-payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "data-futa-state": "CANCELLED",
        "data-futa-final": "true"
      },
      "event": "state",
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "CANCELLED",
        "final": true
      }
    },
    {
      "case": "a capability",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true,
        "token": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
      }
    },
    {
      "case": "the checkout address",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true,
        "checkout_url": "https://checkout.example/pay/c0c0c0c0-0000-4000-8000-00000000000f?token=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
      }
    },
    {
      "case": "the receipt address",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true,
        "receipt_url": "/pay/c0c0c0c0-0000-4000-8000-00000000000f/receipt.pdf?token=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
      }
    },
    {
      "case": "a masked number",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true,
        "masked_phone": "+243•••••0001"
      }
    },
    {
      "case": "a participant",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true,
        "participant": "simulator"
      }
    },
    {
      "case": "a method",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true,
        "method": "synthetic-bank"
      }
    },
    {
      "case": "the return address",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true,
        "return_url": "https://shop.example/order/1042"
      }
    },
    {
      "case": "an amount",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true,
        "amount": 4500
      }
    },
    {
      "case": "an amount and currency",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true,
        "amount": {
          "value": 4500,
          "currency": "USD"
        }
      }
    },
    {
      "case": "the reference",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true,
        "reference": "FT-00000000000040008000000000000001"
      }
    },
    {
      "case": "a target origin",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true,
        "targetOrigin": "*"
      }
    },
    {
      "case": "another type",
      "valid": false,
      "message": {
        "type": "futa.payment",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true
      }
    },
    {
      "case": "another version",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 2,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true
      }
    },
    {
      "case": "a version as text",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": "1",
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true
      }
    },
    {
      "case": "an event the checkout never posts",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "close",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true
      }
    },
    {
      "case": "a command",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "pay",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f"
      }
    },
    {
      "case": "a state outside the read's",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "UNAVAILABLE",
        "final": true
      }
    },
    {
      "case": "a state in lower case",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "approved",
        "final": true
      }
    },
    {
      "case": "a payment that is not an id",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "FT-00000000000040008000000000000001",
        "state": "APPROVED",
        "final": true
      }
    },
    {
      "case": "a payment id in upper case",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "C0C0C0C0-0000-4000-8000-00000000000F",
        "state": "APPROVED",
        "final": true
      }
    },
    {
      "case": "a payment id with more before it",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "xc0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": true
      }
    },
    {
      "case": "a payment id with more after it",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000fx",
        "state": "APPROVED",
        "final": true
      }
    },
    {
      "case": "a payment id before a final newline",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f\n",
        "state": "APPROVED",
        "final": true
      }
    },
    {
      "case": "no payment",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "state": "APPROVED",
        "final": true
      }
    },
    {
      "case": "a state without final",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED"
      }
    },
    {
      "case": "final without a state",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "final": true
      }
    },
    {
      "case": "final as text",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED",
        "final": "true"
      }
    },
    {
      "case": "ready with a state",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "ready",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "APPROVED"
      }
    },
    {
      "case": "ready with final",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "ready",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "final": true
      }
    },
    {
      "case": "an open payment called final",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "CREATED",
        "final": true
      }
    },
    {
      "case": "a waiting payment called final",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "PENDING_APPROVAL",
        "final": true
      }
    },
    {
      "case": "an uncertain payment called final",
      "valid": false,
      "message": {
        "type": "futa.checkout",
        "version": 1,
        "event": "state",
        "payment": "c0c0c0c0-0000-4000-8000-00000000000f",
        "state": "UNCERTAIN",
        "final": true
      }
    },
    {
      "case": "a message that is not an object",
      "valid": false,
      "message": "futa.checkout.port.v1"
    }
  ]
}
