import CustomDump
import XCTest
@testable import ElixxirDAppsSDK

final class SingleUseResponseReportTests: XCTestCase {
  func testCoding() throws {
    let rounds: [Int] = [1, 5, 9]
    let payloadB64 = "rSuPD35ELWwm5KTR9ViKIz/r1YGRgXIl5792SF8o8piZzN6sT4Liq4rUU/nfOPvQEjbfWNh/NYxdJ72VctDnWw=="
    let ephId: Int64 = 1_655_533
    let receptionIdB64 = "emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD"
    let jsonString = """
    {
      "Rounds": [\(rounds.map { "\($0)" }.joined(separator: ", "))],
      "Payload": "\(payloadB64)",
      "EphID": \(ephId),
      "ReceptionID": "\(receptionIdB64)",
      "Err": null
    }
    """
    let jsonData = jsonString.data(using: .utf8)!
    let model = try SingleUseResponseReport.decode(jsonData)

    XCTAssertNoDifference(model, SingleUseResponseReport(
      rounds: rounds,
      payload: Data(base64Encoded: payloadB64)!,
      ephId: ephId,
      receptionId: Data(base64Encoded: receptionIdB64)!,
      error: nil
    ))

    let encodedModel = try model.encode()
    let decodedModel = try SingleUseResponseReport.decode(encodedModel)

    XCTAssertNoDifference(decodedModel, model)
  }

  func testDecodingReportWithError() throws {
    let rounds: [Int] = [1, 5, 9]
    let payloadB64 = "rSuPD35ELWwm5KTR9ViKIz/r1YGRgXIl5792SF8o8piZzN6sT4Liq4rUU/nfOPvQEjbfWNh/NYxdJ72VctDnWw=="
    let ephId: Int64 = 1_655_533
    let receptionIdB64 = "emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD"
    let error = "something went wrong"
    let jsonString = """
    {
      "Rounds": [\(rounds.map { "\($0)" }.joined(separator: ", "))],
      "Payload": "\(payloadB64)",
      "EphID": \(ephId),
      "ReceptionID": "\(receptionIdB64)",
      "Err": "\(error)"
    }
    """
    let jsonData = jsonString.data(using: .utf8)!
    let model = try SingleUseResponseReport.decode(jsonData)

    XCTAssertNoDifference(model, SingleUseResponseReport(
      rounds: rounds,
      payload: Data(base64Encoded: payloadB64)!,
      ephId: ephId,
      receptionId: Data(base64Encoded: receptionIdB64)!,
      error: error
    ))
  }
}