summaryrefslogtreecommitdiff
path: root/spec/frontend/admin/users/components/user_avatar_spec.js
blob: ba4e83690d04960da1149d9dfe1d6f742b1e3fd8 (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
import { GlAvatarLink, GlAvatarLabeled, GlBadge } from '@gitlab/ui';
import { mount } from '@vue/test-utils';

import AdminUserAvatar from '~/admin/users/components/user_avatar.vue';
import { users, paths } from '../mock_data';

describe('AdminUserAvatar component', () => {
  let wrapper;
  const user = users[0];
  const adminUserPath = paths.adminUser;

  const findAvatar = () => wrapper.find(GlAvatarLabeled);
  const findAvatarLink = () => wrapper.find(GlAvatarLink);
  const findAllBadges = () => wrapper.findAll(GlBadge);

  const initComponent = (props = {}) => {
    wrapper = mount(AdminUserAvatar, {
      propsData: {
        user,
        adminUserPath,
        ...props,
      },
    });
  };

  afterEach(() => {
    wrapper.destroy();
    wrapper = null;
  });

  describe('when initialized', () => {
    beforeEach(() => {
      initComponent();
    });

    it("links to the user's admin path", () => {
      expect(findAvatarLink().attributes()).toMatchObject({
        href: adminUserPath.replace('id', user.username),
        'data-user-id': user.id.toString(),
        'data-username': user.username,
      });
    });

    it("renders the user's name", () => {
      expect(findAvatar().props('label')).toBe(user.name);
    });

    it("renders the user's email", () => {
      expect(findAvatar().props('subLabel')).toBe(user.email);
    });

    it("renders the user's avatar image", () => {
      expect(findAvatar().attributes('src')).toBe(user.avatarUrl);
    });

    it("renders the user's badges", () => {
      findAllBadges().wrappers.forEach((badge, idx) => {
        expect(badge.text()).toBe(user.badges[idx].text);
        expect(badge.props('variant')).toBe(user.badges[idx].variant);
      });
    });
  });
});