summaryrefslogtreecommitdiff
path: root/spec/javascripts/ide/lib/files_spec.js
blob: fe791aa2b74bf70e990386222ebcb9a14640ba5e (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
import { viewerInformationForPath } from '~/vue_shared/components/content_viewer/lib/viewer_utils';
import { decorateFiles, splitParent } from '~/ide/lib/files';
import { decorateData } from '~/ide/stores/utils';

const TEST_BRANCH_ID = 'lorem-ipsum';
const TEST_PROJECT_ID = 10;

const createEntries = paths => {
  const createEntry = (acc, { path, type, children }) => {
    // Sometimes we need to end the url with a '/'
    const createUrl = base => (type === 'tree' ? `${base}/` : base);

    const { name, parent } = splitParent(path);
    const parentEntry = acc[parent];

    acc[path] = {
      ...decorateData({
        projectId: TEST_PROJECT_ID,
        branchId: TEST_BRANCH_ID,
        id: path,
        name,
        path,
        url: createUrl(`/${TEST_PROJECT_ID}/${type}/${TEST_BRANCH_ID}/-/${path}`),
        type,
        previewMode: viewerInformationForPath(path),
        parentPath: parent,
        parentTreeUrl: parentEntry
          ? parentEntry.url
          : createUrl(`/${TEST_PROJECT_ID}/${type}/${TEST_BRANCH_ID}`),
      }),
      tree: children.map(childName => jasmine.objectContaining({ name: childName })),
    };

    return acc;
  };

  const entries = paths.reduce(createEntry, {});

  // Wrap entries in jasmine.objectContaining.
  // We couldn't do this earlier because we still need to select properties from parent entries.
  return Object.keys(entries).reduce((acc, key) => {
    acc[key] = jasmine.objectContaining(entries[key]);

    return acc;
  }, {});
};

describe('IDE lib decorate files', () => {
  it('creates entries and treeList', () => {
    const data = ['app/assets/apples/foo.js', 'app/bugs.js', 'README.md'];
    const expectedEntries = createEntries([
      { path: 'app', type: 'tree', children: ['assets', 'bugs.js'] },
      { path: 'app/assets', type: 'tree', children: ['apples'] },
      { path: 'app/assets/apples', type: 'tree', children: ['foo.js'] },
      { path: 'app/assets/apples/foo.js', type: 'blob', children: [] },
      { path: 'app/bugs.js', type: 'blob', children: [] },
      { path: 'README.md', type: 'blob', children: [] },
    ]);

    const { entries, treeList } = decorateFiles({
      data,
      branchId: TEST_BRANCH_ID,
      projectId: TEST_PROJECT_ID,
    });

    // Here we test the keys and then each key/value individually because `expect(entries).toEqual(expectedEntries)`
    // was taking a very long time for some reason. Probably due to large objects and nested `jasmine.objectContaining`.
    const entryKeys = Object.keys(entries);

    expect(entryKeys).toEqual(Object.keys(expectedEntries));
    entryKeys.forEach(key => {
      expect(entries[key]).toEqual(expectedEntries[key]);
    });

    expect(treeList).toEqual([expectedEntries.app, expectedEntries['README.md']]);
  });
});