summaryrefslogtreecommitdiff
path: root/spec/javascripts/lib/utils/users_cache_spec.js
blob: 50371c8c5f6b792204825acf2fc9655c0e0de0b3 (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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import Api from '~/api';
import UsersCache from '~/lib/utils/users_cache';

describe('UsersCache', () => {
  const dummyUsername = 'win';
  const dummyUser = 'has a farm';

  beforeEach(() => {
    UsersCache.internalStorage = { };
  });

  describe('get', () => {
    it('returns undefined for empty cache', () => {
      expect(UsersCache.internalStorage).toEqual({ });

      const user = UsersCache.get(dummyUsername);

      expect(user).toBe(undefined);
    });

    it('returns undefined for missing user', () => {
      UsersCache.internalStorage['no body'] = 'no data';

      const user = UsersCache.get(dummyUsername);

      expect(user).toBe(undefined);
    });

    it('returns matching user', () => {
      UsersCache.internalStorage[dummyUsername] = dummyUser;

      const user = UsersCache.get(dummyUsername);

      expect(user).toBe(dummyUser);
    });
  });

  describe('hasData', () => {
    it('returns false for empty cache', () => {
      expect(UsersCache.internalStorage).toEqual({ });

      expect(UsersCache.hasData(dummyUsername)).toBe(false);
    });

    it('returns false for missing user', () => {
      UsersCache.internalStorage['no body'] = 'no data';

      expect(UsersCache.hasData(dummyUsername)).toBe(false);
    });

    it('returns true for matching user', () => {
      UsersCache.internalStorage[dummyUsername] = dummyUser;

      expect(UsersCache.hasData(dummyUsername)).toBe(true);
    });
  });

  describe('remove', () => {
    it('does nothing if cache is empty', () => {
      expect(UsersCache.internalStorage).toEqual({ });

      UsersCache.remove(dummyUsername);

      expect(UsersCache.internalStorage).toEqual({ });
    });

    it('does nothing if cache contains no matching data', () => {
      UsersCache.internalStorage['no body'] = 'no data';

      UsersCache.remove(dummyUsername);

      expect(UsersCache.internalStorage['no body']).toBe('no data');
    });

    it('removes matching data', () => {
      UsersCache.internalStorage[dummyUsername] = dummyUser;

      UsersCache.remove(dummyUsername);

      expect(UsersCache.internalStorage).toEqual({ });
    });
  });

  describe('retrieve', () => {
    let apiSpy;

    beforeEach(() => {
      spyOn(Api, 'users').and.callFake((query, options) => apiSpy(query, options));
    });

    it('stores and returns data from API call if cache is empty', (done) => {
      apiSpy = (query, options) => {
        expect(query).toBe('');
        expect(options).toEqual({ username: dummyUsername });
        return Promise.resolve({
          data: [dummyUser],
        });
      };

      UsersCache.retrieve(dummyUsername)
      .then((user) => {
        expect(user).toBe(dummyUser);
        expect(UsersCache.internalStorage[dummyUsername]).toBe(dummyUser);
      })
      .then(done)
      .catch(done.fail);
    });

    it('returns undefined if Ajax call fails and cache is empty', (done) => {
      const dummyError = new Error('server exploded');
      apiSpy = (query, options) => {
        expect(query).toBe('');
        expect(options).toEqual({ username: dummyUsername });
        return Promise.reject(dummyError);
      };

      UsersCache.retrieve(dummyUsername)
      .then(user => fail(`Received unexpected user: ${JSON.stringify(user)}`))
      .catch((error) => {
        expect(error).toBe(dummyError);
      })
      .then(done)
      .catch(done.fail);
    });

    it('makes no Ajax call if matching data exists', (done) => {
      UsersCache.internalStorage[dummyUsername] = dummyUser;
      apiSpy = () => fail(new Error('expected no Ajax call!'));

      UsersCache.retrieve(dummyUsername)
      .then((user) => {
        expect(user).toBe(dummyUser);
      })
      .then(done)
      .catch(done.fail);
    });
  });
});