aboutsummaryrefslogtreecommitdiff
path: root/packages/web-util/src/tests/swr.ts
blob: 95c62ebeafc467ba5ed701ce581b5113bfd5bc64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
 This file is part of GNU Taler
 (C) 2021 Taler Systems S.A.

 GNU Taler is free software; you can redistribute it and/or modify it under the
 terms of the GNU General Public License as published by the Free Software
 Foundation; either version 3, or (at your option) any later version.

 GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

 You should have received a copy of the GNU General Public License along with
 GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
 */

import { ComponentChildren, FunctionalComponent, h, VNode } from "preact";
import { MockEnvironment, Query } from "./mock.js";
import { SWRConfig } from "swr";

export { Query };
/**
 * Helper for hook that use SWR inside.
 * 
 * buildTestingContext() will return a testing context
 * 
 */
export class SwrMockEnvironment extends MockEnvironment {
  constructor(debug = false) {
    super(debug);
  }

  mockApiIfNeeded(): void {
    null; // do nothing
  }

  public buildTestingContext(): FunctionalComponent<{
    children: ComponentChildren;
  }> {
    const __REGISTER_REQUEST = this.registerRequest.bind(this);
    return function TestingContext({
      children,
    }: {
      children: ComponentChildren;
    }): VNode {
      return h(
        SWRConfig,
        {
          value: {
            fetcher: (url: string, options: object) => {
              const mocked = __REGISTER_REQUEST(
                {
                  method: "get",
                  url,
                },
                {},
              );
              if (!mocked) return undefined;
              if (mocked.status > 400) {
                const e: any = Error("simulated error for testing");
                //example error handling from https://swr.vercel.app/docs/error-handling
                e.status = mocked.status;
                throw e;
              }
              return mocked.payload;
            },
            //These options are set for ending the test faster
            //otherwise SWR will create timeouts that will live after the test finished
            loadingTimeout: 0,
            dedupingInterval: 0,
            shouldRetryOnError: false,
            errorRetryInterval: 0,
            errorRetryCount: 0,
            //clean cache for every test
            provider: () => new Map(),
          },
        },
        children,
      );
    };
  }
}