Skip to content

Commit 2ebd284

Browse files
louimjneurock
authored andcommitted
Unwrap type for non-null lists of non null items (#31)
non null lists were not unwrapped, producing an error like: index.js:89 TypeError: Cannot read property 'id' of undefined at getFieldType (index.js:15) at selectedFieldsReducer (index.js:26) at utils.js:41 at Array.reduce (<anonymous>) at index.js:41 at create.js:15 at create.js:35 at query.js:29 at Object.nonNullListOfPeople (utils.js:41) at eval (mock.js:105) Add an acceptance test covering the problem to prevent regressions.
1 parent ba38d7b commit 2ebd284

7 files changed

Lines changed: 45 additions & 0 deletions

File tree

addon/fields/info/create.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import FieldInfo from './model';
22
import { getArgsForField } from '../args';
33
import { getIsRelayConnection } from '../../relay/connection';
44
import { getSelectedFields } from '../selections';
5+
import { unwrapNonNull } from '../../utils';
56

67
const composeGetFieldInfo = (getArgsForField, getSelectedFields, getIsRelayConnection) =>
78
(field, type, fragments, getType) => {
@@ -19,6 +20,7 @@ const getFieldInfo = composeGetFieldInfo(getArgsForField, getSelectedFields,
1920

2021
export const composeCreateFieldInfo = (getFieldInfo) =>
2122
(field, fieldName, type, fragments, getType) => {
23+
type = unwrapNonNull(type);
2224
let { args, fields, isList, isRelayConnection, recordType } =
2325
getFieldInfo(field, type, fragments, getType);
2426

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { module, test } from 'qunit';
2+
import { setupApplicationTest } from 'ember-qunit';
3+
import { visit } from '@ember/test-helpers';
4+
5+
module('Acceptance | non null list of people', function(hooks) {
6+
setupApplicationTest(hooks);
7+
8+
test('it correctly unwraps non null list of non null items', async function(assert) {
9+
server.createList('person', 2);
10+
11+
await visit('/people/non-null-list-of-people');
12+
13+
let people = this.element.querySelectorAll('h2');
14+
15+
assert.equal(people.length, 2, 'There are 2 people displayed');
16+
});
17+
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
query nonNullListOfPeople {
2+
nonNullListOfPeople {
3+
id
4+
firstName
5+
lastName
6+
}
7+
}

tests/dummy/app/gql/schema.graphql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,6 @@ type Query {
9999
people(firstName: String, lastName: String, pageSize: Int): [Person]
100100

101101
peopleSameAgeAsDogYears: [Person]
102+
103+
nonNullListOfPeople: [Person!]!
102104
}

tests/dummy/app/router.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const Router = EmberRouter.extend({
99
Router.map(function() {
1010
this.route('customer', { path: '/customer/:customer_id' });
1111
this.route('people', function() {
12+
this.route('non-null-list-of-people');
1213
this.route('same-age-as-dog-years');
1314
this.route('same-name-as-pets');
1415
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import Route from '@ember/routing/route';
2+
import query from 'dummy/gql/queries/non-null-list-of-people';
3+
import { inject as service } from '@ember/service';
4+
5+
export default Route.extend({
6+
apollo: service(),
7+
8+
async model() {
9+
let model = await this.get('apollo').watchQuery({ query });
10+
11+
return model;
12+
}
13+
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{{#each this.model.nonNullListOfPeople as |person|}}
2+
<h2>{{person.firstName}} {{person.lastName}}</h2>
3+
{{/each}}

0 commit comments

Comments
 (0)