Skip to content
This repository was archived by the owner on Dec 15, 2022. It is now read-only.

Commit fe3927f

Browse files
committed
Merge pull request #2104 from atom/aw/author-info-tooltip
Get author info tooltips working again
1 parent 7d44d99 commit fe3927f

File tree

6 files changed

+108
-20
lines changed

6 files changed

+108
-20
lines changed

lib/containers/__generated__/userMentionTooltipContainer_repositoryOwner.graphql.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/containers/user-mention-tooltip-container.js

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
44

55
import Octicon from '../atom/octicon';
66

7-
class UserMentionTooltip extends React.Component {
7+
export class BareUserMentionTooltipContainer extends React.Component {
88
static propTypes = {
99
repositoryOwner: PropTypes.shape({
1010
login: PropTypes.string.isRequired,
@@ -17,15 +17,15 @@ class UserMentionTooltip extends React.Component {
1717
company: PropTypes.string,
1818

1919
// Organizations
20-
members: PropTypes.shape({
20+
membersWithRole: PropTypes.shape({
2121
totalCount: PropTypes.number.isRequired,
2222
}),
2323
}).isRequired,
2424
}
2525

2626
render() {
2727
const owner = this.props.repositoryOwner;
28-
const {login, company, repositories, members} = owner;
28+
const {login, company, repositories, membersWithRole} = owner;
2929
return (
3030
<div className="github-UserMentionTooltip">
3131
<div className="github-UserMentionTooltip-avatar">
@@ -36,7 +36,9 @@ class UserMentionTooltip extends React.Component {
3636
<Octicon icon="mention" /><strong>{login}</strong>
3737
</div>
3838
{company && <div><Octicon icon="briefcase" /><span>{company}</span></div>}
39-
{members && <div><Octicon icon="organization" /><span>{members.totalCount} members</span></div>}
39+
{membersWithRole && (
40+
<div><Octicon icon="organization" /><span>{membersWithRole.totalCount} members</span></div>
41+
)}
4042
<div><Octicon icon="repo" /><span>{repositories.totalCount} repositories</span></div>
4143
</div>
4244
<div style={{clear: 'both'}} />
@@ -45,12 +47,20 @@ class UserMentionTooltip extends React.Component {
4547
}
4648
}
4749

48-
export default createFragmentContainer(UserMentionTooltip, {
50+
export default createFragmentContainer(BareUserMentionTooltipContainer, {
4951
repositoryOwner: graphql`
5052
fragment userMentionTooltipContainer_repositoryOwner on RepositoryOwner {
51-
login avatarUrl repositories { totalCount }
52-
... on User { company }
53-
... on Organization { members { totalCount } }
53+
login
54+
avatarUrl
55+
repositories { totalCount }
56+
... on User {
57+
company
58+
}
59+
... on Organization {
60+
membersWithRole {
61+
totalCount
62+
}
63+
}
5464
}
5565
`,
5666
});

lib/items/__generated__/userMentionTooltipItemQuery.graphql.js

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/builder/graphql/base/spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export class FragmentSpec extends Spec {
5252
);
5353
throw new Error(`Unrecognized node kind ${node.kind}`);
5454
} else {
55-
return fn(node);
55+
return fn({...node});
5656
}
5757
});
5858

@@ -62,7 +62,6 @@ export class FragmentSpec extends Spec {
6262
for (let i = selections.length - 1; i >= 0; i--) {
6363
if (selections[i].kind === 'InlineFragment') {
6464
// Replace inline fragments in-place with their selected fields *if* the GraphQL type name matches.
65-
6665
if (!typeNameSet.has(selections[i].type)) {
6766
continue;
6867
}
@@ -77,6 +76,7 @@ export class FragmentSpec extends Spec {
7776
};
7877

7978
for (const node of this.nodes) {
79+
node.selections = node.selections.slice();
8080
flattenFragments(node.selections);
8181
}
8282
}

test/builder/graphql/user.js

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1-
import {createSpecBuilderClass} from './base';
1+
import {createSpecBuilderClass, createConnectionBuilderClass, createUnionBuilderClass, defer} from './base';
22
import {nextID} from '../id-sequence';
33

4+
const RepositoryBuilder = defer('../repository', 'RepositoryBuilder');
5+
6+
export const RepositoryConnectionBuilder = createConnectionBuilderClass('Repository', RepositoryBuilder);
7+
48
export const UserBuilder = createSpecBuilderClass('User', {
59
__typename: {default: 'User'},
610
id: {default: nextID},
@@ -10,8 +14,35 @@ export const UserBuilder = createSpecBuilderClass('User', {
1014
const login = f.login || 'login';
1115
return `https://github.com/${login}`;
1216
}},
17+
company: {default: 'GitHub'},
18+
repositories: {linked: RepositoryConnectionBuilder},
19+
},
20+
'Node & Actor & RegistryPackageOwner & RegistryPackageSearch & ProjectOwner ' +
21+
'& RepositoryOwner & UniformResourceLocatable',
22+
);
23+
24+
export const OrganizationMemberConnectionBuilder = createConnectionBuilderClass('OrganizationMember', UserBuilder);
25+
26+
export const OrganizationBuilder = createSpecBuilderClass('Organization', {
27+
login: {default: 'someone'},
28+
avatarUrl: {default: 'https://avatars3.githubusercontent.com/u/17565?s=32&v=4'},
29+
repositories: {linked: RepositoryConnectionBuilder},
30+
membersWithRole: {linked: OrganizationMemberConnectionBuilder},
31+
},
32+
'Node & Actor & RegistryPackageOwner & RegistryPackageSearch & ProjectOwner ' +
33+
'& RepositoryOwner & UniformResourceLocatable & MemberStatusable',
34+
);
35+
36+
export const RepositoryOwnerBuilder = createUnionBuilderClass('RepositoryOwner', {
37+
beUser: UserBuilder,
38+
beOrganization: OrganizationBuilder,
39+
default: 'beUser',
1340
});
1441

1542
export function userBuilder(...nodes) {
1643
return UserBuilder.onFragmentQuery(nodes);
1744
}
45+
46+
export function organizationBuilder(...nodes) {
47+
return OrganizationBuilder.onFragmentQuery(nodes);
48+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import React from 'react';
2+
import {shallow} from 'enzyme';
3+
4+
import {BareUserMentionTooltipContainer} from '../../lib/containers/user-mention-tooltip-container';
5+
import {userBuilder, organizationBuilder} from '../builder/graphql/user';
6+
7+
import ownerQuery from '../../lib/containers/__generated__/userMentionTooltipContainer_repositoryOwner.graphql';
8+
9+
describe('UserMentionTooltipContainer', function() {
10+
function buildApp(override = {}) {
11+
const props = {
12+
...override,
13+
};
14+
15+
return <BareUserMentionTooltipContainer {...props} />;
16+
}
17+
18+
it('renders information about a User', function() {
19+
const wrapper = shallow(buildApp({
20+
repositoryOwner: userBuilder(ownerQuery)
21+
.login('someone')
22+
.avatarUrl('https://i.redd.it/03xcogvbr6v21.jpg')
23+
.company('Infinity, Ltd.')
24+
.repositories(conn => conn.totalCount(5))
25+
.build(),
26+
}));
27+
28+
assert.strictEqual(wrapper.find('img').prop('src'), 'https://i.redd.it/03xcogvbr6v21.jpg');
29+
assert.isTrue(wrapper.find('span').someWhere(s => s.text() === 'Infinity, Ltd.'));
30+
assert.isTrue(wrapper.find('span').someWhere(s => s.text() === '5 repositories'));
31+
});
32+
33+
it('renders information about an Organization', function() {
34+
const wrapper = shallow(buildApp({
35+
repositoryOwner: organizationBuilder(ownerQuery)
36+
.login('acme')
37+
.avatarUrl('https://i.redd.it/eekf8onik0v21.jpg')
38+
.membersWithRole(conn => conn.totalCount(10))
39+
.repositories(conn => conn.totalCount(5))
40+
.build(),
41+
}));
42+
43+
assert.strictEqual(wrapper.find('img').prop('src'), 'https://i.redd.it/eekf8onik0v21.jpg');
44+
assert.isTrue(wrapper.find('span').someWhere(s => s.text() === '10 members'));
45+
assert.isTrue(wrapper.find('span').someWhere(s => s.text() === '5 repositories'));
46+
});
47+
});

0 commit comments

Comments
 (0)