Skip to content

Commit

Permalink
Default to base interface if the object is not defined
Browse files Browse the repository at this point in the history
  • Loading branch information
rebeccajfriedman committed Mar 5, 2019
1 parent 4b88b6b commit f93a7d2
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 20 deletions.
6 changes: 4 additions & 2 deletions src/decode.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,11 +116,13 @@ function transformScalars(context, value) {
}

function recordTypeInformation(context, value) {
const selectionSet = context.selection.selectionSet;

if (isValue(value)) {
if (value.__typename) {
value.type = schemaForType(context.selection.selectionSet.typeBundle, value.__typename);
value.type = schemaForType(selectionSet.typeBundle, value.__typename, selectionSet.typeSchema);
} else {
value.type = context.selection.selectionSet.typeSchema;
value.type = selectionSet.typeSchema;
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/schema-for-type.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
export default function schemaForType(typeBundle, typeName) {
export default function schemaForType(typeBundle, typeName, typeSchema = null) {
const type = typeBundle.types[typeName];

if (type) {
return type;
} else if (typeSchema && typeSchema.kind === 'INTERFACE') {
return typeSchema;
}

throw new Error(`No type of ${typeName} found in schema`);
}

30 changes: 15 additions & 15 deletions test/decode-unknown-type-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,24 @@ const checkoutQuery = new Query(typeBundle, (root) => {
});
});

suite.only('decode-unknown-type-test', () => {
suite('decode-unknown-type-test', () => {
test('it decodes an interface into a type', () => {
const data = {
node: {
__typename: 'Checkout',
discountApplication: {
__typename: "DiscountCodeApplication",
targetSelection: "ALL",
targetType: "SHIPPING_LINE",
code: "SHIPPINGFREE",
},
},
__typename: 'DiscountCodeApplication',
targetSelection: 'ALL',
targetType: 'SHIPPING_LINE',
code: 'SHIPPINGFREE'
}
}
};

const decoded = decode(checkoutQuery, data);

assert.ok(decoded);
assert.equal(decoded.node.discountApplication.type.name, "DiscountCodeApplication");
assert.equal(decoded.node.discountApplication.type.name, 'DiscountCodeApplication');
assert.equal(decoded.node.discountApplication.targetSelection, data.node.discountApplication.targetSelection);
assert.equal(decoded.node.discountApplication.targetType, data.node.discountApplication.targetType);
assert.equal(decoded.node.discountApplication.code, data.node.discountApplication.code);
Expand All @@ -45,19 +45,19 @@ suite.only('decode-unknown-type-test', () => {
node: {
__typename: 'Checkout',
discountApplication: {
__typename: "AutomaticDiscountApplication",
targetSelection: "ALL",
targetType: "SHIPPING_LINE",
},
},
__typename: 'AutomaticDiscountApplication',
targetSelection: 'ALL',
targetType: 'SHIPPING_LINE'
}
}
};

const decoded = decode(checkoutQuery, data);

assert.ok(decoded);
assert.equal(decoded.node.discountApplication.type.name, "DiscountApplication");
assert.equal(decoded.node.discountApplication.type.name, 'DiscountApplication');
assert.equal(decoded.node.discountApplication.targetSelection, data.node.discountApplication.targetSelection);
assert.equal(decoded.node.discountApplication.targetType, data.node.discountApplication.targetType);
assert.equal(decoded.node.discountApplication.code, data.node.discountApplication.code);
assert.equal(decoded.node.discountApplication.code, null);
});
});
3 changes: 2 additions & 1 deletion test/schema-type-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ suite('schema-type-test', () => {
});

test('returns the correct type for an enum', () => {
let currencyCodeType = realTypeBundle.types.CurrencyCode;
const currencyCodeType = realTypeBundle.types.CurrencyCode;

assert.deepEqual(schemaForType(realTypeBundle, 'CurrencyCode'), currencyCodeType);
});
});

0 comments on commit f93a7d2

Please sign in to comment.