1*082815dcSEvan Baconimport { ConfigPlugin } from '../../Plugin.types';
2*082815dcSEvan Baconimport { withPlugins } from '../withPlugins';
3*082815dcSEvan Baconimport { createRunOncePlugin, withRunOnce } from '../withRunOnce';
4*082815dcSEvan Bacon
5*082815dcSEvan Bacondescribe(withRunOnce, () => {
6*082815dcSEvan Bacon  it('runs plugins multiple times without withRunOnce', () => {
7*082815dcSEvan Bacon    const pluginA: ConfigPlugin = jest.fn((config) => config);
8*082815dcSEvan Bacon
9*082815dcSEvan Bacon    withPlugins({ extra: [], _internal: { projectRoot: '.' } } as any, [
10*082815dcSEvan Bacon      // Prove unsafe runs as many times as it was added
11*082815dcSEvan Bacon      pluginA,
12*082815dcSEvan Bacon      pluginA,
13*082815dcSEvan Bacon    ]);
14*082815dcSEvan Bacon
15*082815dcSEvan Bacon    // Unsafe runs multiple times
16*082815dcSEvan Bacon    expect(pluginA).toBeCalledTimes(2);
17*082815dcSEvan Bacon  });
18*082815dcSEvan Bacon
19*082815dcSEvan Bacon  it('prevents running different plugins with same id', () => {
20*082815dcSEvan Bacon    const pluginA: ConfigPlugin = jest.fn((config) => config);
21*082815dcSEvan Bacon    const pluginB: ConfigPlugin = jest.fn((config) => config);
22*082815dcSEvan Bacon
23*082815dcSEvan Bacon    const pluginId = 'foo';
24*082815dcSEvan Bacon
25*082815dcSEvan Bacon    const safePluginA = createRunOncePlugin(pluginA, pluginId);
26*082815dcSEvan Bacon    // A different plugin with the same ID as (A), this proves
27*082815dcSEvan Bacon    // that different plugins can be prevented when using the same ID.
28*082815dcSEvan Bacon    const safePluginB = createRunOncePlugin(pluginB, pluginId);
29*082815dcSEvan Bacon
30*082815dcSEvan Bacon    withPlugins({ extra: [], _internal: { projectRoot: '.' } } as any, [
31*082815dcSEvan Bacon      // Run plugin twice
32*082815dcSEvan Bacon      safePluginA,
33*082815dcSEvan Bacon      safePluginB,
34*082815dcSEvan Bacon    ]);
35*082815dcSEvan Bacon
36*082815dcSEvan Bacon    // Prove that each plugin is only run once
37*082815dcSEvan Bacon    expect(pluginA).toBeCalledTimes(1);
38*082815dcSEvan Bacon    expect(pluginB).toBeCalledTimes(0);
39*082815dcSEvan Bacon  });
40*082815dcSEvan Bacon
41*082815dcSEvan Bacon  it('prevents running the same plugin twice', () => {
42*082815dcSEvan Bacon    const pluginA: ConfigPlugin = jest.fn((config) => config);
43*082815dcSEvan Bacon    const pluginId = 'foo';
44*082815dcSEvan Bacon
45*082815dcSEvan Bacon    const safePluginA = createRunOncePlugin(pluginA, pluginId);
46*082815dcSEvan Bacon
47*082815dcSEvan Bacon    withPlugins({ extra: [], _internal: { projectRoot: '.' } } as any, [
48*082815dcSEvan Bacon      // Run plugin twice
49*082815dcSEvan Bacon      safePluginA,
50*082815dcSEvan Bacon      safePluginA,
51*082815dcSEvan Bacon    ]);
52*082815dcSEvan Bacon
53*082815dcSEvan Bacon    // Prove that each plugin is only run once
54*082815dcSEvan Bacon    expect(pluginA).toBeCalledTimes(1);
55*082815dcSEvan Bacon  });
56*082815dcSEvan Bacon});
57