@testspectra/react-native 1.3.1 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +45 -9
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1681,8 +1681,8 @@ function createMockHandle(rule, release) {
1681
1681
  respondWith: async (newFixture, newOptions = {}) => {
1682
1682
  const newObj = newFixture;
1683
1683
  rule.response = newObj && newObj.body !== void 0 ? newObj.body : newFixture;
1684
- if (newOptions.statusCode || newObj && newObj.statusCode) {
1685
- rule.statusCode = newOptions.statusCode || newObj?.statusCode || 200;
1684
+ if (newOptions.statusCode || newObj && (newObj.statusCode || newObj.status)) {
1685
+ rule.statusCode = newOptions.statusCode || newObj?.statusCode || newObj?.status || 200;
1686
1686
  }
1687
1687
  if (newOptions.headers || newObj && newObj.headers) {
1688
1688
  rule.headers = newOptions.headers || newObj?.headers;
@@ -1695,7 +1695,7 @@ function createMockHandle(rule, release) {
1695
1695
  respondOnce: async (newFixture, newOptions = {}) => {
1696
1696
  const newObj = newFixture;
1697
1697
  const resp = newObj && newObj.body !== void 0 ? newObj.body : newFixture;
1698
- const statusCode = newOptions.statusCode || newObj && newObj.statusCode || rule.statusCode || 200;
1698
+ const statusCode = newOptions.statusCode || newObj && (newObj.statusCode || newObj.status) || rule.statusCode || 200;
1699
1699
  const headers = newOptions.headers || newObj && newObj.headers || rule.headers;
1700
1700
  const delayMs = newOptions.delayMs ?? (newObj && newObj.delayMs) ?? rule.delayMs;
1701
1701
  rule.respondOnceQueue.push({ response: resp, statusCode, headers, delayMs });
@@ -1731,6 +1731,19 @@ function createMockHandle(rule, release) {
1731
1731
  });
1732
1732
  }
1733
1733
  };
1734
+ handle.shouldHaveCallCount = (count, options = {}) => trackStep(
1735
+ "assertion",
1736
+ { type: "assertion", key: "have.callCount", target: `intercept ${rule.method} ${rule.pattern}`, args: [count] },
1737
+ async () => {
1738
+ const ok = await pollCondition(() => rule.callCount === count, options.timeout ?? getAssertionTimeoutMs());
1739
+ if (!ok) {
1740
+ const seen = rule.calls.map((call) => `${call.method} ${call.url}`).join(", ");
1741
+ throw new Error(
1742
+ `Expected intercept '${rule.pattern}' (${rule.method}) to have answered ${count} request(s), but it answered ${rule.callCount}${seen ? `: ${seen}` : ""}`
1743
+ );
1744
+ }
1745
+ }
1746
+ );
1734
1747
  const getCount = () => rule.callCount;
1735
1748
  handle.callCount = Object.assign(getCount, {
1736
1749
  valueOf: () => rule.callCount,
@@ -1809,6 +1822,27 @@ function recordMockCall(rule, request) {
1809
1822
  }
1810
1823
  return request;
1811
1824
  }
1825
+ function readMockEnvelope(value) {
1826
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
1827
+ const record = value;
1828
+ const keys = Object.keys(record);
1829
+ if (keys.length === 0 || !keys.every((key) => ENVELOPE_KEYS.has(key))) return null;
1830
+ const status = typeof record.status === "number" ? record.status : record.statusCode;
1831
+ if (!("body" in record) && typeof status !== "number") return null;
1832
+ return { body: record.body ?? "", statusCode: status, headers: record.headers, delayMs: record.delayMs };
1833
+ }
1834
+ async function resolveMockResponse(rule, request) {
1835
+ const consumed = consumeMockResponse(rule);
1836
+ const value = typeof consumed.body === "function" ? await consumed.body(request) : consumed.body;
1837
+ const envelope = readMockEnvelope(value);
1838
+ if (!envelope) return { ...consumed, body: value };
1839
+ return {
1840
+ body: envelope.body,
1841
+ statusCode: envelope.statusCode ?? consumed.statusCode,
1842
+ headers: { ...consumed.headers, ...envelope.headers },
1843
+ delayMs: envelope.delayMs ?? consumed.delayMs
1844
+ };
1845
+ }
1812
1846
  function consumeMockResponse(rule) {
1813
1847
  if (rule.respondOnceQueue.length > 0) {
1814
1848
  const queued = rule.respondOnceQueue.shift();
@@ -1841,10 +1875,12 @@ function mockResponseBodyText(body) {
1841
1875
  if (typeof body === "object" && body !== null) return JSON.stringify(body);
1842
1876
  return String(body ?? "");
1843
1877
  }
1844
- var DEFAULT_MOCK_RESPONSE_HEADERS;
1878
+ var ENVELOPE_KEYS, DEFAULT_MOCK_RESPONSE_HEADERS;
1845
1879
  var init_mock_intercept = __esm({
1846
1880
  "../../core/worker-runtime/src/dsl/mock_intercept.ts"() {
1847
1881
  "use strict";
1882
+ init_reporter();
1883
+ ENVELOPE_KEYS = /* @__PURE__ */ new Set(["status", "statusCode", "headers", "body", "delayMs"]);
1848
1884
  DEFAULT_MOCK_RESPONSE_HEADERS = {
1849
1885
  "Content-Type": "application/json; charset=utf-8",
1850
1886
  "Access-Control-Allow-Origin": "*",
@@ -2106,7 +2142,7 @@ async function patchedFetch(origFetch, input, init) {
2106
2142
  if (rule.aborted) {
2107
2143
  throw new TypeError(`Spectra.intercept() aborted ${method} ${url} (${rule.abortReason || "Failed"})`);
2108
2144
  }
2109
- const consumed = consumeMockResponse(rule);
2145
+ const consumed = await resolveMockResponse(rule, intercepted);
2110
2146
  if (consumed.delayMs && consumed.delayMs > 0) await sleep(consumed.delayMs);
2111
2147
  return buildMockResponse(consumed);
2112
2148
  }
@@ -2143,8 +2179,7 @@ function patchXMLHttpRequest() {
2143
2179
  setTimeout(fireError, 0);
2144
2180
  return;
2145
2181
  }
2146
- const consumed = consumeMockResponse(rule);
2147
- const respond2 = () => {
2182
+ const respond2 = (consumed) => {
2148
2183
  const bodyText = mockResponseBodyText(consumed.body);
2149
2184
  Object.defineProperties(xhr, {
2150
2185
  status: { value: consumed.statusCode, configurable: true },
@@ -2160,8 +2195,9 @@ function patchXMLHttpRequest() {
2160
2195
  xhr.dispatchEvent?.(new Event("load"));
2161
2196
  xhr.dispatchEvent?.(new Event("loadend"));
2162
2197
  };
2163
- if (consumed.delayMs && consumed.delayMs > 0) setTimeout(respond2, consumed.delayMs);
2164
- else setTimeout(respond2, 0);
2198
+ void resolveMockResponse(rule, intercepted).then((consumed) => {
2199
+ setTimeout(() => respond2(consumed), consumed.delayMs && consumed.delayMs > 0 ? consumed.delayMs : 0);
2200
+ });
2165
2201
  };
2166
2202
  return xhr;
2167
2203
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testspectra/react-native",
3
- "version": "1.3.1",
3
+ "version": "1.3.3",
4
4
  "description": "Native Android & iOS component test runner for React Native with TestSpectra Spectra.* DSL",
5
5
  "keywords": [
6
6
  "testspectra",
@@ -32,7 +32,7 @@
32
32
  "dependencies": {
33
33
  "cross-spawn": "^7.0.6",
34
34
  "esbuild": "^0.28.2",
35
- "@testspectra/matchers": "1.3.1"
35
+ "@testspectra/matchers": "1.3.3"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "react": ">=18.0.0",