{"version":3,"file":"clarify-api-test-support.cjs","sources":["../src/handlers/token.ts","../src/handlers/rpc.ts","../src/handlers/insert.ts","../src/handlers/save-signals.ts","../src/handlers/data-frame.ts","../src/handlers/evaluate.ts","../src/index.ts"],"sourcesContent":["import { rest } from \"msw\";\nimport {createHmac} from 'crypto';\n\nexport const DEFAULT_CLIENT_ID = \"lz0LcPTCYZf1O5ZbhFHPqy1sehIAuCCC\";\nexport const DEFAULT_INTEGRATION = \"c8tf6rphqir8n9561099\";\nconst MOCK_SECRET = 'mock-secret';\n\nconst header = {\n  \"alg\": \"HS256\",\n  \"typ\": \"JWT\",\n}\n\nconst validPayload = {\n  \"https://clfy.io/roles\": [\n    `iM:${DEFAULT_INTEGRATION}`\n  ],\n  \"iss\": \"https://login.clarify.cloud/\",\n  \"sub\": `${DEFAULT_CLIENT_ID}@clients`,\n  \"aud\": \"https://api.clarify.cloud/v1/\",\n  \"iat\": 1653558118,\n  \"exp\": 1653566718,\n  \"azp\": DEFAULT_CLIENT_ID,\n  \"gty\": \"client-credentials\"\n}\n\nconst INVALID_TOKEN_CHARACTERS = /[=+/]/g;\n\nconst replaceInvalidCharacters = (value: string) => {\n  return value.replace(INVALID_TOKEN_CHARACTERS, (character) => {\n    switch (character) {\n      case '=':\n        return '';\n      case '+':\n        return '-';\n      case '/':\n        return '_';\n      default: \n        return character;\n    }\n  });\n};\n\nexport let validToken = () => {\n  return rest.post('https://api.clarify.cloud/v1/oauth/token', (_req, res, ctx) => {\n    let headerEncoded = replaceInvalidCharacters(Buffer.from(JSON.stringify(header)).toString('base64'))\n    let payloadEncoded = replaceInvalidCharacters(Buffer.from(JSON.stringify({\n      ...validPayload,\n      iat: Date.now(),\n      exp: Date.now() + 3600,\n    })).toString('base64'))\n\n    let signature = createHmac('sha256', MOCK_SECRET);\n    signature.update(`${headerEncoded}.${payloadEncoded}`);\n    let encodedSignature = replaceInvalidCharacters(signature.digest ('base64'));\n\n    return res(ctx.json({\n      access_token: `${headerEncoded}.${payloadEncoded}.${encodedSignature}`,\n      expires_in: 3600,\n      token_type: 'Bearer',\n    }))\n  });  \n}\n\nexport let invalidToken = () => {\n  return rest.post('https://api.clarify.cloud/v1/oauth/token', (_req, res, ctx) => {\n    return res(\n      ctx.status(401, 'Unauthorized'),\n      ctx.json({ \n        error: 'access_denied', \n        error_description: 'Unauthorized' \n      })\n    );\n  });  \n}","import { RPCMethod } from '@clarify/api';\nimport { MockedRequest, RequestHandler, DefaultBodyType, ResponseResolver, context, ResponseTransformer} from 'msw';\n\ninterface SerializedResponse<BodyType = any> {\n  status: number;\n  statusText: string;\n  headers: unknown;\n  body: BodyType;\n}\n\ntype ResultType<RPCHandlerMethod extends RPCMethod> = (request: JSONRPCRequest<RPCHandlerMethod>, body: RPCHandlerMethod['resultType']) => ResponseTransformer<{id: string, jsonrpc: '2.0', method: string, result: RPCHandlerMethod['resultType']}>\n\nexport const result = <RPCHandlerMethod extends RPCMethod>(\n  request: JSONRPCRequest<RPCHandlerMethod>,\n  body: RPCHandlerMethod['resultType'],\n): ResponseTransformer<{id: string, jsonrpc: '2.0', method: string, result: RPCHandlerMethod['resultType']}> => {\n  return (res) => {\n    res.headers.set('Content-Type', 'application/json')\n    res.body = JSON.stringify({\n      id: request.rpcRequest.id,\n      jsonrpc: \"2.0\",\n      method: request.rpcRequest.method,\n      result: body,\n    });\n    return res;\n  }\n}\n\ntype ErrorType<RPCHandlerMethod extends RPCMethod> = (request: JSONRPCRequest<RPCHandlerMethod>, body: RPCHandlerMethod['errorType']) => ResponseTransformer<{id: string, jsonrpc: '2.0', method: string, error: RPCHandlerMethod['errorType']}>\n\nexport const error = <RPCHandlerMethod extends RPCMethod>(\n  request: JSONRPCRequest<RPCHandlerMethod>,\n  body: RPCHandlerMethod['errorType'],\n): ResponseTransformer<{id: string, jsonrpc: '2.0', method: string, error: RPCHandlerMethod['errorType']}> => {\n  return (res) => {\n    res.headers.set('Content-Type', 'application/json')\n    res.body = JSON.stringify({\n      id: request.rpcRequest.id,\n      jsonrpc: \"2.0\",\n      method: request.rpcRequest.method,\n      error: body,\n    });\n\n    return res\n  }\n}\n\n\ninterface ParsedResult<T extends RPCMethod = RPCMethod> {\n  id: string;\n  method: string;\n  params: T['parameters'];\n}\n\nexport type RPCContext<RPCHandlerMethod extends RPCMethod> = {\n  status: typeof context.status;\n  set: typeof context.set;\n  delay: typeof context.delay;\n  fetch: typeof context.fetch;\n  result: ResultType<RPCHandlerMethod>;\n  error: ErrorType<RPCHandlerMethod>\n}\n\nexport interface JSONRPCRequest<RPCHandlerMethod extends RPCMethod> extends MockedRequest<any> {\n  rpcRequest: {\n    id: string;\n    method: string;  \n    params: RPCHandlerMethod['parameters'];\n  }\n}\n\nexport class RPCHandler<RPCHandlerMethod extends RPCMethod, RequestType extends MockedRequest<DefaultBodyType> = MockedRequest<DefaultBodyType>> extends RequestHandler<{ header: string;}, MockedRequest, ParsedResult | null, JSONRPCRequest<RPCHandlerMethod>> {\n  method: string;\n  url: string;\n\n  constructor(url: string, method: string, resolver: ResponseResolver<any, any>) {\n    super({\n      info: {\n        header: `${method}`,\n      },\n      ctx: {\n        set: context.set,\n        status: context.status,\n        delay: context.delay,\n        result: result,\n        error: error,\n        fetch: context.fetch,\n      },\n      resolver,\n    })\n    this.method = method;\n    this.url = url;\n  }\n\n  predicate(request: MockedRequest, parsedResult: ParsedResult): boolean {\n    if (request.url.href === this.url && parsedResult?.method === this.method) {\n      return true;\n    }\n    return false;\n  }\n\n  protected getPublicRequest(\n    request: MockedRequest,\n    parsedResult: ParsedResult,\n  ): JSONRPCRequest<RPCHandlerMethod> {\n    return {\n      ...request,\n      rpcRequest: {\n        id: parsedResult!.id,\n        method: parsedResult!.method,\n        params: parsedResult!.params,\n      }\n    }\n  }\n\n  log(request: RequestType, response: SerializedResponse<any>, _handler: this, parsedRequest: ParsedResult) {\n    console.groupCollapsed(`${parsedRequest.method} ${response.status} ${response.statusText}`);\n    console.log('Request:', request)\n    console.log('Handler:', this)\n    console.log('Response:', response)\n    console.groupEnd()\n  }\n\n  parse(request: MockedRequest): ParsedResult | null {\n    let body = request.body as {id: string, jsonrpc: '2.0', method: string, params: any};\n    if (body.id != null && body.jsonrpc === '2.0' && body.method) {\n      return {\n        id: body.id,\n        method: body.method,\n        params: body.params,\n      };\n    }\n    return null\n  }\n   \n}\n\nexport type ClarifyRPCLink = ReturnType<typeof rpc['link']>\n\nexport let rpc = {\n  link(url: string) {\n    return {\n      method<RPCHandlerMethod extends RPCMethod>(name: RPCHandlerMethod['method'], resolver: ResponseResolver<JSONRPCRequest<RPCHandlerMethod>, RPCContext<RPCHandlerMethod>>) {\n        return new RPCHandler(url, name, resolver);\n      }\n    }\n  }\n};","import { ClarifyRPCLink } from \"./rpc\";\nimport {InsertRPCMethod, RPCErrorCode, SaveResult} from '@clarify/api';\nimport { SinonSpy } from \"sinon\";\n\ntype InsertStub = SinonSpy<[InsertRPCMethod['parameters']]>\n\nexport function insert(rpc: ClarifyRPCLink, fake?: InsertStub) {\n  return rpc.method<InsertRPCMethod>('integration.Insert', (req, res, context) => {\n    fake?.(req.rpcRequest.params);\n    let signalsByInput: {[key: string]: SaveResult} = {};\n    for (let key of Object.keys(req.rpcRequest.params.data.series)) {\n      signalsByInput[key] = {id: key, created: false, updated: false};\n    }\n    return res(context.result(req, {\n      signalsByInput,\n    }));\n  });\n}\n\nexport function insertError(rpc: ClarifyRPCLink, fake?: InsertStub) {\n  return rpc.method<InsertRPCMethod>('integration.Insert', (req, res, context) => {\n    fake?.(req.rpcRequest.params);\n    return res(context.error(req, {\n      code: RPCErrorCode.operationNotPermitted,\n      message: \"Operation not permitted\",\n    }));\n  });\n}\n","import { ClarifyRPCLink } from \"./rpc\";\nimport {SaveSignalsRPCMethod, RPCErrorCode, SaveResult} from '@clarify/api';\nimport { SinonSpy } from \"sinon\";\n\ntype InsertStub = SinonSpy<[SaveSignalsRPCMethod['parameters']]>\n\nexport function saveSignals(rpc: ClarifyRPCLink, fake?: InsertStub) {\n  return rpc.method<SaveSignalsRPCMethod>('integration.SaveSignals', (req, res, context) => {\n    fake?.(req.rpcRequest.params);\n    let signalsByInput: {[key: string]: SaveResult} = {};\n    for (let key of Object.keys(req.rpcRequest.params.signalsByInput)) {\n      signalsByInput[key] = {id: key, created: false, updated: false};\n    }\n    return res(context.result(req, {\n      signalsByInput,\n    }));\n  });\n}\n\nexport function saveSignalsError(rpc: ClarifyRPCLink, fake?: InsertStub) {\n  return rpc.method<SaveSignalsRPCMethod>('integration.SaveSignals', (req, res, context) => {\n    fake?.(req.rpcRequest.params);\n    return res(context.error(req, {\n      code: RPCErrorCode.operationNotPermitted,\n      message: \"Operation not permitted\",\n    }));\n  });\n}\n","import { ClarifyRPCLink } from \"./rpc\";\nimport {DataFrameRPCMethod, RPCErrorCode} from '@clarify/api';\nimport { SinonSpy } from \"sinon\";\n\nexport type DataFrameStub = SinonSpy<[DataFrameRPCMethod['parameters']]>\n\nexport function dataFrame(rpc: ClarifyRPCLink, fake?: DataFrameStub) {\n  return rpc.method<DataFrameRPCMethod>('clarify.dataFrame', (req, res, context) => {\n    fake?.(req.rpcRequest.params);\n    return res(context.result(req, {\n        included: [],\n        meta: {\n          total: 2,\n          format: {\n            groupIncludedByType: false,\n          }\n        },\n        dataFrame: {\n          \"times\": [\"2021-03-11T21:00:00Z\", \"2021-04-08T00:00:00Z\"],\n          \"series\": {\n            \"c92rtu2sahsul7t74fag_avg\": [61, 34],\n            \"c92rtu2sahsul7t74fag_count\": [5, 1],\n            \"c92rtu2sahsul7t74fag_max\": [-10.0, 34],\n            \"c92rtu2sahsul7t74fag_min\": [231, 34],\n            \"c92rtu2sahsul7t74fag_sum\": [306, 34],\n            \"c92rujqsahsunml6lo00_avg\": [250000, 0],\n            \"c92rujqsahsunml6lo00_count\": [1, 0],\n            \"c92rujqsahsunml6lo00_max\": [250000, null],\n            \"c92rujqsahsunml6lo00_min\": [250000, null],\n            \"c92rujqsahsunml6lo00_sum\": [250000, 0]\n          }\n        },\n    }));\n  });\n}\n\nexport function dataFrameError(rpc: ClarifyRPCLink, fake?: DataFrameStub) {\n  return rpc.method<DataFrameRPCMethod>('clarify.dataFrame', (req, res, context) => {\n    fake?.(req.rpcRequest.params);\n    return res(context.error(req, {\n      code: RPCErrorCode.operationNotPermitted,\n      message: \"Operation not permitted\",\n    }));\n  });\n}\n","import { ClarifyRPCLink } from \"./rpc\";\nimport {EvaluateRPCMethod, RPCErrorCode} from '@clarify/api';\nimport { SinonSpy } from \"sinon\";\n\nexport type EvaluateStub = SinonSpy<[EvaluateRPCMethod['parameters']]>\n\nexport function evaluate(rpc: ClarifyRPCLink, fake?: EvaluateStub) {\n  return rpc.method<EvaluateRPCMethod>('clarify.evaluate', (req, res, context) => {\n    fake?.(req.rpcRequest.params);\n    return res(context.result(req, {\n        included: [],\n        data: {\n          \"times\": [\"2021-03-11T21:00:00Z\", \"2021-04-08T00:00:00Z\"],\n          \"series\": {\n            \"i1\": [61, 34],\n            \"i2\": [5, 1],\n            \"i3\": [-10.0, 34],\n            \"c1\": [231, 34],\n            \"c2\": [306, null],\n          }\n        },\n        meta: {\n          total: 2,\n          format: {\n            groupIncludedByType: false,\n          }\n        }\n    }));\n  });\n}\n\nexport function evaluateError(rpc: ClarifyRPCLink, fake?: EvaluateStub) {\n  return rpc.method<EvaluateRPCMethod>('clarify.evaluate', (req, res, context) => {\n    fake?.(req.rpcRequest.params);\n    return res(context.error(req, {\n      code: RPCErrorCode.operationNotPermitted,\n      message: \"Operation not permitted\",\n    }));\n  });\n}\n","import { DEFAULT_CLIENT_ID, DEFAULT_INTEGRATION } from './handlers/token';\n\nexport const CLARIFY_API_URL = \"https://api.clarify.io/v1/\"\nexport const CLARIFY_STAGING_API_URL = \"https://api.clarify.cloud/v1/\"\n\nexport const CLARIFY_CREDENTIALS = {\n  credentials: {\n    type: 'client-credentials',\n    clientId: DEFAULT_CLIENT_ID,\n    clientSecret: 'secret',\n  },\n  integration: DEFAULT_INTEGRATION,\n  apiUrl: CLARIFY_STAGING_API_URL,\n}\n\nexport {rpc} from './handlers/rpc';\nexport {validToken, invalidToken} from './handlers/token';\nexport {insert, insertError} from './handlers/insert';\nexport {saveSignals, saveSignalsError} from './handlers/save-signals';\nexport {dataFrame, dataFrameError, type DataFrameStub} from './handlers/data-frame';\nexport {evaluate, evaluateError, type EvaluateStub} from './handlers/evaluate';"],"names":["rest","createHmac","RequestHandler","context","RPCErrorCode"],"mappings":"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"}