Skip to content

Commit 6a40496

Browse files
committed
Auto merge of #4162 - Turbo87:fix-nameless-owners, r=locks
OwnersList: Fall back to `login` if `name` is not filled Fixes #4161
2 parents 7ed3f85 + 51b6eb5 commit 6a40496

File tree

3 files changed

+146
-7
lines changed

3 files changed

+146
-7
lines changed

app/components/owners-list.hbs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<ul
22
role="list"
33
local-class="list {{if this.showDetailedList "detailed"}}"
4-
data-test-owners
4+
data-test-owners="{{if this.showDetailedList "detailed" "basic"}}"
55
>
66
{{#each @owners as |owner|}}
77
<li local-class="{{if (eq owner.kind "team") "team"}}">
@@ -11,8 +11,8 @@
1111
local-class="link"
1212
data-test-owner-link={{owner.login}}
1313
>
14-
<UserAvatar @user={{owner}} @size="medium-small" local-class="avatar" />
15-
<span local-class="name">{{or owner.display_name owner.name}}</span>
14+
<UserAvatar @user={{owner}} @size="medium-small" local-class="avatar" aria-hidden="true" />
15+
<span local-class="name {{unless this.showDetailedList "hidden-name"}}">{{or owner.display_name owner.name owner.login}}</span>
1616
</LinkTo>
1717
</li>
1818
{{/each}}

app/components/owners-list.module.css

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,6 @@
3434
> * {
3535
margin: 0 10px 10px 0;
3636
}
37-
38-
.name {
39-
display: none;
40-
}
4137
}
4238

4339
.avatar {
@@ -50,3 +46,7 @@
5046
border-radius: 4px;
5147
}
5248
}
49+
50+
.hidden-name {
51+
composes: sr-only from '../styles/shared/a11y.module.css';
52+
}

tests/components/owners-list-test.js

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
import { render } from '@ember/test-helpers';
2+
import { module, test } from 'qunit';
3+
4+
import { hbs } from 'ember-cli-htmlbars';
5+
6+
import { setupRenderingTest } from 'cargo/tests/helpers';
7+
8+
import setupMirage from '../helpers/setup-mirage';
9+
10+
module('Component | OwnersList', function (hooks) {
11+
setupRenderingTest(hooks);
12+
setupMirage(hooks);
13+
14+
test('single user', async function (assert) {
15+
let crate = this.server.create('crate');
16+
this.server.create('version', { crate });
17+
18+
let user = this.server.create('user');
19+
this.server.create('crate-ownership', { crate, user });
20+
21+
let store = this.owner.lookup('service:store');
22+
this.crate = await store.findRecord('crate', crate.name);
23+
await this.crate.hasMany('owner_team').load();
24+
await this.crate.hasMany('owner_user').load();
25+
26+
await render(hbs`<OwnersList @owners={{this.crate.owners}} />`);
27+
assert.dom('[data-test-owners="detailed"]').exists();
28+
assert.dom('ul > li').exists({ count: 1 });
29+
assert.dom('[data-test-owner-link]').exists({ count: 1 });
30+
31+
let logins = [...this.element.querySelectorAll('[data-test-owner-link]')].map(it => it.dataset.testOwnerLink);
32+
assert.deepEqual(logins, ['user-1']);
33+
34+
assert.dom('[data-test-owner-link="user-1"]').hasText('User 1');
35+
assert.dom('[data-test-owner-link="user-1"]').hasAttribute('href', '/users/user-1');
36+
});
37+
38+
test('user without `name`', async function (assert) {
39+
let crate = this.server.create('crate');
40+
this.server.create('version', { crate });
41+
42+
let user = this.server.create('user', { name: null, login: 'anonymous' });
43+
this.server.create('crate-ownership', { crate, user });
44+
45+
let store = this.owner.lookup('service:store');
46+
this.crate = await store.findRecord('crate', crate.name);
47+
await this.crate.hasMany('owner_team').load();
48+
await this.crate.hasMany('owner_user').load();
49+
50+
await render(hbs`<OwnersList @owners={{this.crate.owners}} />`);
51+
assert.dom('[data-test-owners="detailed"]').exists();
52+
assert.dom('ul > li').exists({ count: 1 });
53+
assert.dom('[data-test-owner-link]').exists({ count: 1 });
54+
55+
let logins = [...this.element.querySelectorAll('[data-test-owner-link]')].map(it => it.dataset.testOwnerLink);
56+
assert.deepEqual(logins, ['anonymous']);
57+
58+
assert.dom('[data-test-owner-link="anonymous"]').hasText('anonymous');
59+
assert.dom('[data-test-owner-link="anonymous"]').hasAttribute('href', '/users/anonymous');
60+
});
61+
62+
test('five users', async function (assert) {
63+
let crate = this.server.create('crate');
64+
this.server.create('version', { crate });
65+
66+
for (let i = 0; i < 5; i++) {
67+
let user = this.server.create('user');
68+
this.server.create('crate-ownership', { crate, user });
69+
}
70+
71+
let store = this.owner.lookup('service:store');
72+
this.crate = await store.findRecord('crate', crate.name);
73+
await this.crate.hasMany('owner_team').load();
74+
await this.crate.hasMany('owner_user').load();
75+
76+
await render(hbs`<OwnersList @owners={{this.crate.owners}} />`);
77+
assert.dom('[data-test-owners="detailed"]').exists();
78+
assert.dom('ul > li').exists({ count: 5 });
79+
assert.dom('[data-test-owner-link]').exists({ count: 5 });
80+
81+
let logins = [...this.element.querySelectorAll('[data-test-owner-link]')].map(it => it.dataset.testOwnerLink);
82+
assert.deepEqual(logins, ['user-1', 'user-2', 'user-3', 'user-4', 'user-5']);
83+
});
84+
85+
test('six users', async function (assert) {
86+
let crate = this.server.create('crate');
87+
this.server.create('version', { crate });
88+
89+
for (let i = 0; i < 6; i++) {
90+
let user = this.server.create('user');
91+
this.server.create('crate-ownership', { crate, user });
92+
}
93+
94+
let store = this.owner.lookup('service:store');
95+
this.crate = await store.findRecord('crate', crate.name);
96+
await this.crate.hasMany('owner_team').load();
97+
await this.crate.hasMany('owner_user').load();
98+
99+
await render(hbs`<OwnersList @owners={{this.crate.owners}} />`);
100+
assert.dom('[data-test-owners="basic"]').exists();
101+
assert.dom('ul > li').exists({ count: 6 });
102+
assert.dom('[data-test-owner-link]').exists({ count: 6 });
103+
104+
let logins = [...this.element.querySelectorAll('[data-test-owner-link]')].map(it => it.dataset.testOwnerLink);
105+
assert.deepEqual(logins, ['user-1', 'user-2', 'user-3', 'user-4', 'user-5', 'user-6']);
106+
});
107+
108+
test('teams mixed with users', async function (assert) {
109+
let crate = this.server.create('crate');
110+
this.server.create('version', { crate });
111+
112+
for (let i = 0; i < 3; i++) {
113+
let user = this.server.create('user');
114+
this.server.create('crate-ownership', { crate, user });
115+
}
116+
for (let i = 0; i < 2; i++) {
117+
let team = this.server.create('team', { org: 'crates-io' });
118+
this.server.create('crate-ownership', { crate, team });
119+
}
120+
121+
let store = this.owner.lookup('service:store');
122+
this.crate = await store.findRecord('crate', crate.name);
123+
await this.crate.hasMany('owner_team').load();
124+
await this.crate.hasMany('owner_user').load();
125+
126+
await render(hbs`<OwnersList @owners={{this.crate.owners}} />`);
127+
assert.dom('[data-test-owners="detailed"]').exists();
128+
assert.dom('ul > li').exists({ count: 5 });
129+
assert.dom('[data-test-owner-link]').exists({ count: 5 });
130+
131+
let logins = [...this.element.querySelectorAll('[data-test-owner-link]')].map(it => it.dataset.testOwnerLink);
132+
assert.deepEqual(logins, ['github:crates-io:team-1', 'github:crates-io:team-2', 'user-1', 'user-2', 'user-3']);
133+
134+
assert.dom('[data-test-owner-link="github:crates-io:team-1"]').hasText('crates-io/team-1');
135+
assert
136+
.dom('[data-test-owner-link="github:crates-io:team-1"]')
137+
.hasAttribute('href', '/teams/github:crates-io:team-1');
138+
});
139+
});

0 commit comments

Comments
 (0)