Skip to content

Commit 8f8536e

Browse files
nersohchinesedfan
authored andcommitted
test: Add UserListItem component tests (#897)
1 parent 4815274 commit 8f8536e

File tree

2 files changed

+122
-1
lines changed

2 files changed

+122
-1
lines changed
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import React from 'react';
2+
import { shallow } from 'enzyme';
3+
import { UserListItem } from 'components';
4+
5+
const store = {
6+
subscribe: jest.fn(),
7+
getState: jest.fn(() => ({ auth: { user: { login: 'gitpoint'}}})),
8+
dispatch: jest.fn()
9+
};
10+
11+
const defaultProps = {
12+
user: {
13+
type: 'User',
14+
login: 'gitpoint',
15+
avatar_url: 'gitpoint-avatar.png',
16+
},
17+
navigation: {
18+
navigate: jest.fn(),
19+
}
20+
};
21+
22+
describe('<UserListItem />', () => {
23+
beforeEach(() => {
24+
jest.clearAllMocks();
25+
});
26+
27+
it('should navigate to AuthProfile screen when item is the logged in user', () => {
28+
const wrapper = shallow(<UserListItem {...defaultProps} />, { context: { store }}).dive();
29+
30+
wrapper.find('Styled(TouchableHighlight)').simulate('press');
31+
32+
expect(defaultProps.navigation.navigate).toHaveBeenCalledTimes(1);
33+
expect(defaultProps.navigation.navigate).toHaveBeenCalledWith('AuthProfile', expect.anything());
34+
});
35+
36+
it('should navigate to Profile screen when item is not the logged in user', () => {
37+
const wrapper = shallow(
38+
<UserListItem {...defaultProps} user={{ type: 'User', login: 'someone' }} />,
39+
{ context: { store }}
40+
).dive();
41+
42+
wrapper.find('Styled(TouchableHighlight)').simulate('press');
43+
44+
expect(defaultProps.navigation.navigate).toHaveBeenCalledTimes(1);
45+
expect(defaultProps.navigation.navigate).toHaveBeenCalledWith('Profile', expect.anything());
46+
});
47+
48+
it('should navigate to Organization screen when item is not user type', () => {
49+
const wrapper = shallow(
50+
<UserListItem {...defaultProps} user={{ type: '', login: 'org' }} />,
51+
{ context: { store }}
52+
).dive();
53+
54+
wrapper.find('Styled(TouchableHighlight)').simulate('press');
55+
56+
expect(defaultProps.navigation.navigate).toHaveBeenCalledTimes(1);
57+
expect(defaultProps.navigation.navigate).toHaveBeenCalledWith('Organization', expect.anything());
58+
});
59+
60+
it('should navigate to user screen when user component is pressed', () => {
61+
const wrapper = shallow(<UserListItem {...defaultProps} />, { context: { store }}).dive();
62+
63+
wrapper.find('[data-testid="userListItem-user"]').simulate('press');
64+
65+
expect(defaultProps.navigation.navigate).toHaveBeenCalledTimes(1);
66+
expect(defaultProps.navigation.navigate).toHaveBeenCalledWith(expect.any(String), { user: defaultProps.user });
67+
});
68+
69+
it('should navigate to user screen when user image container is pressed', () => {
70+
const wrapper = shallow(<UserListItem {...defaultProps} />, { context: { store }}).dive();
71+
72+
wrapper.find('[data-testid="userListItem-imageContainer"]').simulate('press');
73+
74+
expect(defaultProps.navigation.navigate).toHaveBeenCalledTimes(1);
75+
expect(defaultProps.navigation.navigate).toHaveBeenCalledWith(expect.any(String), { user: defaultProps.user });
76+
});
77+
it('should render user image', () => {
78+
const wrapper = shallow(<UserListItem {...defaultProps} />, { context: { store }}).dive();
79+
const image = wrapper.find('[data-testid="userListItem-image"]');
80+
81+
expect(image.prop('source').uri).toBe(defaultProps.user.avatar_url);
82+
});
83+
84+
it('should render user login as title', () => {
85+
const wrapper = shallow(<UserListItem {...defaultProps} />, { context: { store }}).dive();
86+
const title = wrapper.find('Styled(Text)');
87+
88+
expect(title.contains(defaultProps.user.login)).toBe(true);
89+
});
90+
91+
it('should render title and subtitle', () => {
92+
const wrapper = shallow(
93+
<UserListItem {...defaultProps} title="git" subtitle="point" />,
94+
{ context: { store }}
95+
).dive();
96+
const hasTitle = wrapper.find('Styled(Text)').contains('git');
97+
const hasSubtitle = wrapper.find('Styled(Text)').contains('point');
98+
99+
expect(hasTitle).toBe(true);
100+
expect(hasSubtitle).toBe(true);
101+
});
102+
103+
it('should call iconAction', () => {
104+
const iconAction = jest.fn();
105+
const wrapper = shallow(
106+
<UserListItem {...defaultProps} iconAction={iconAction} />,
107+
{ context: { store }}
108+
).dive();
109+
110+
wrapper.find('[data-testid="userListItem-icon"]').simulate('press');
111+
112+
expect(iconAction).toHaveBeenCalledTimes(1);
113+
expect(iconAction).toHaveBeenCalledWith(defaultProps.user.login);
114+
});
115+
});

src/components/user-list-item.component.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,20 +133,23 @@ class UserListItemComponent extends Component {
133133
>
134134
<Wrapper>
135135
<UserComponent
136+
data-testid="userListItem-user"
136137
onPress={() =>
137138
navigation.navigate(userScreen, {
138139
user,
139140
})
140141
}
141142
>
142143
<ImageContainerComponent
144+
data-testid="userListItem-imageContainer"
143145
onPress={() =>
144146
navigation.navigate(userScreen, {
145147
user,
146148
})
147149
}
148150
>
149151
<Avatar
152+
data-testid="userListItem-image"
150153
source={{
151154
uri: user.avatar_url,
152155
}}
@@ -160,7 +163,10 @@ class UserListItemComponent extends Component {
160163
</TitleSubtitleContainer>
161164
</UserComponent>
162165

163-
<IconComponent onPress={() => iconAction(user.login)}>
166+
<IconComponent
167+
data-testid="userListItem-icon"
168+
onPress={() => iconAction(user.login)}
169+
>
164170
<Icon
165171
color={colors.grey}
166172
size={icon ? 24 : 28}

0 commit comments

Comments
 (0)