1import { RouteNode, sortRoutes } from '../Route';
2import { generateDynamic } from '../getRoutes';
3
4const asRouteNode = (route: string) =>
5  ({
6    children: [],
7    dynamic: generateDynamic(route),
8    loadRoute(): any {
9      return {
10        default() {
11          return null;
12        },
13      };
14    },
15    route,
16    contextKey: 'INVALID_TEST_VALUE',
17  }) as RouteNode;
18
19describe(sortRoutes, () => {
20  it(`sorts index routes by priority`, () => {
21    // Index before deep dynamic
22    expect(sortRoutes(asRouteNode('index'), asRouteNode('[...a]'))).toBe(-1);
23    // Index before dynamic
24    expect(sortRoutes(asRouteNode('index'), asRouteNode('[a]'))).toBe(-1);
25    // Index before named
26    expect(sortRoutes(asRouteNode('index'), asRouteNode('a'))).toBe(-1);
27    expect(sortRoutes(asRouteNode('index'), asRouteNode('z'))).toBe(-1);
28
29    // Index tied with group
30    expect(sortRoutes(asRouteNode('index'), asRouteNode('(z)'))).toBe(2);
31  });
32  it(`sorts group routes by priority`, () => {
33    expect(sortRoutes(asRouteNode('(zzz)'), asRouteNode('[...a]'))).toBe(-1);
34    expect(sortRoutes(asRouteNode('(zzz)'), asRouteNode('[a]'))).toBe(-1);
35    expect(sortRoutes(asRouteNode('(zzz)'), asRouteNode('a'))).toBe(-1);
36    expect(sortRoutes(asRouteNode('(zzz)'), asRouteNode('z'))).toBe(-1);
37    expect(sortRoutes(asRouteNode('(zzz)'), asRouteNode('index'))).toBe(0);
38  });
39  it(`sorts multiple dynamic routes higher than a single deep dynamic route`, () => {
40    // dynamic before deep dynamic
41    expect(sortRoutes(asRouteNode('[a]/[b]'), asRouteNode('[...a]'))).toBe(-1);
42    expect(sortRoutes(asRouteNode('[...a]'), asRouteNode('[a]/[b]'))).toBe(1);
43  });
44
45  it(`sorts dynamic routes by priority`, () => {
46    // dynamic before deep dynamic
47    expect(sortRoutes(asRouteNode('[a]'), asRouteNode('[...a]'))).toBe(-1);
48    // tied with two dynamic routes
49    expect(sortRoutes(asRouteNode('[a]'), asRouteNode('[b]'))).toBe(0);
50    expect(sortRoutes(asRouteNode('[a]/[b]'), asRouteNode('[b]/[a]'))).toBe(0);
51    // Lower priority
52    expect(sortRoutes(asRouteNode('[a]'), asRouteNode('index'))).toBe(1);
53    expect(sortRoutes(asRouteNode('[a]'), asRouteNode('a'))).toBe(1);
54    expect(sortRoutes(asRouteNode('[a]'), asRouteNode('(a)'))).toBe(1);
55  });
56  it(`sorts deep dynamic routes by priority`, () => {
57    expect(sortRoutes(asRouteNode('[...a]'), asRouteNode('[...beta]'))).toBe(0);
58    expect(sortRoutes(asRouteNode('[...a]/[b]'), asRouteNode('[...beta]/[c]'))).toBe(0);
59    // Lower priority
60    expect(sortRoutes(asRouteNode('[...a]'), asRouteNode('[b]'))).toBe(1);
61    expect(sortRoutes(asRouteNode('[...a]/[a]'), asRouteNode('[b]/[c]'))).toBe(1);
62    expect(sortRoutes(asRouteNode('[...a]'), asRouteNode('index'))).toBe(1);
63    expect(sortRoutes(asRouteNode('[...a]'), asRouteNode('a'))).toBe(1);
64    expect(sortRoutes(asRouteNode('[...a]'), asRouteNode('(a)'))).toBe(1);
65  });
66});
67