Skip to content

Commit 0e40ebd

Browse files
fix: issue: [2717] coverage calculation improvements (#2775)
* fix: issue: [2717] coverage calculation improvments * changeset --------- Co-authored-by: TuvalSimha <[email protected]>
1 parent acee8cd commit 0e40ebd

File tree

4 files changed

+72
-20
lines changed

4 files changed

+72
-20
lines changed

.changeset/eighty-dingos-end.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@graphql-inspector/coverage-command': minor
3+
'@graphql-inspector/core': minor
4+
---
5+
6+
Fix: coverage calculation improvements: Covered Queries & Covered Mutations & Covered Subscriptions

packages/commands/coverage/src/index.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,14 +192,30 @@ function renderCoverage(coverage: SchemaCoverage) {
192192
method: 'Total Queries',
193193
result: String(coverage.stats.numQueries > 0 ? coverage.stats.numQueries : '0'),
194194
},
195+
{
196+
method: 'Covered Queries',
197+
result: String(coverage.stats.numCoveredQueries > 0 ? coverage.stats.numCoveredQueries : '0'),
198+
},
195199
{
196200
method: 'Total Mutations',
197201
result: String(coverage.stats.numMutations > 0 ? coverage.stats.numMutations : '0'),
198202
},
203+
{
204+
method: 'Covered Mutations',
205+
result: String(
206+
coverage.stats.numCoveredMutations > 0 ? coverage.stats.numCoveredMutations : '0',
207+
),
208+
},
199209
{
200210
method: 'Total Subscriptions',
201211
result: String(coverage.stats.numSubscriptions > 0 ? coverage.stats.numSubscriptions : '0'),
202212
},
213+
{
214+
method: 'Covered Subscriptions',
215+
result: String(
216+
coverage.stats.numCoveredSubscriptions > 0 ? coverage.stats.numCoveredSubscriptions : '0',
217+
),
218+
},
203219
];
204220
Logger.table(logStatsResult);
205221
Logger.log(``);

packages/core/__tests__/coverage/coverage.test.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ describe('coverage', () => {
2323
2424
type Mutation {
2525
submitPost(title: String!, author: String!): Post!
26+
removePost(id: Int!): Post!
2627
}
2728
2829
schema {
@@ -56,6 +57,10 @@ describe('coverage', () => {
5657
id
5758
}
5859
}
60+
61+
mutation removePost {
62+
removePost(id: 1)
63+
}
5964
`);
6065

6166
const results = coverage(schema, [new Source(print(doc))]);
@@ -78,7 +83,7 @@ describe('coverage', () => {
7883
expect(results.types.Identifiable.children.id.hits).toEqual(1);
7984
expect(results.types.Identifiable.children.createdAt.hits).toEqual(0);
8085
// Mutation
81-
expect(results.types.Mutation.hits).toEqual(1);
86+
expect(results.types.Mutation.hits).toEqual(2);
8287
expect(results.types.Mutation.children.submitPost.hits).toEqual(1);
8388
expect(results.types.Mutation.children.submitPost.children.title.hits).toEqual(1);
8489
expect(results.types.Mutation.children.submitPost.children.author.hits).toEqual(1);
@@ -87,8 +92,12 @@ describe('coverage', () => {
8792
expect(results.stats.numTypes).toEqual(4);
8893
expect(results.stats.numTypesCovered).toEqual(4);
8994
expect(results.stats.numTypesCoveredFully).toEqual(1);
90-
expect(results.stats.numFields).toEqual(14);
91-
expect(results.stats.numFiledsCovered).toEqual(10);
95+
expect(results.stats.numFields).toEqual(16);
96+
expect(results.stats.numFiledsCovered).toEqual(12);
97+
expect(results.stats.numQueries).toEqual(3);
98+
expect(results.stats.numCoveredQueries).toEqual(2);
99+
expect(results.stats.numMutations).toEqual(2);
100+
expect(results.stats.numCoveredMutations).toEqual(2);
92101
});
93102

94103
test('no coverage', () => {
@@ -121,11 +130,14 @@ describe('coverage', () => {
121130
expect(results.stats.numTypes).toEqual(4);
122131
expect(results.stats.numTypesCovered).toEqual(0);
123132
expect(results.stats.numTypesCoveredFully).toEqual(0);
124-
expect(results.stats.numFields).toEqual(14);
133+
expect(results.stats.numFields).toEqual(16);
125134
expect(results.stats.numFiledsCovered).toEqual(0);
126-
expect(results.stats.numQueries).toEqual(1);
135+
expect(results.stats.numQueries).toEqual(3);
136+
expect(results.stats.numCoveredQueries).toEqual(0);
127137
expect(results.stats.numSubscriptions).toEqual(0);
128-
expect(results.stats.numMutations).toEqual(1);
138+
expect(results.stats.numCoveredSubscriptions).toEqual(0);
139+
expect(results.stats.numMutations).toEqual(2);
140+
expect(results.stats.numCoveredMutations).toEqual(0);
129141
});
130142

131143
test('introspection', () => {

packages/core/src/coverage/index.ts

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,11 @@ export interface SchemaCoverage {
6161
numTypesCovered: number;
6262
numFields: number;
6363
numQueries: number;
64+
numCoveredQueries: number;
6465
numMutations: number;
66+
numCoveredMutations: number;
6567
numSubscriptions: number;
68+
numCoveredSubscriptions: number;
6669
numFieldsCovered: number;
6770
numFiledsCovered: number; // @deprecated will be removed in next major version
6871
};
@@ -85,8 +88,11 @@ export function coverage(schema: GraphQLSchema, sources: Source[]): SchemaCovera
8588
numFieldsCovered: 0,
8689
numFiledsCovered: 0,
8790
numQueries: 0,
91+
numCoveredQueries: 0,
8892
numMutations: 0,
93+
numCoveredMutations: 0,
8994
numSubscriptions: 0,
95+
numCoveredSubscriptions: 0,
9096
},
9197
};
9298
const typeMap = schema.getTypeMap();
@@ -108,6 +114,18 @@ export function coverage(schema: GraphQLSchema, sources: Source[]): SchemaCovera
108114
const fieldCoverage = typeCoverage.children[fieldDef.name];
109115
const locations = fieldCoverage.locations[sourceName];
110116

117+
switch (typeCoverage.type.name) {
118+
case 'Query':
119+
coverage.stats.numCoveredQueries++;
120+
break;
121+
case 'Mutation':
122+
coverage.stats.numCoveredMutations++;
123+
break;
124+
case 'Subscription':
125+
coverage.stats.numCoveredSubscriptions++;
126+
break;
127+
}
128+
111129
typeCoverage.hits++;
112130
fieldCoverage.hits++;
113131

@@ -146,23 +164,23 @@ export function coverage(schema: GraphQLSchema, sources: Source[]): SchemaCovera
146164
children: {},
147165
};
148166

149-
if (isObjectType(type) || isInterfaceType(type)) {
150-
switch (type.name) {
151-
case 'Query':
152-
coverage.stats.numQueries++;
153-
break;
154-
case 'Mutation':
155-
coverage.stats.numMutations++;
156-
break;
157-
case 'Subscription':
158-
coverage.stats.numSubscriptions++;
159-
break;
160-
}
161-
}
162-
163167
const fieldMap = type.getFields();
164168

165169
for (const fieldname in fieldMap) {
170+
if (isObjectType(type) || isInterfaceType(type)) {
171+
switch (type.name) {
172+
case 'Query':
173+
coverage.stats.numQueries++;
174+
break;
175+
case 'Mutation':
176+
coverage.stats.numMutations++;
177+
break;
178+
case 'Subscription':
179+
coverage.stats.numSubscriptions++;
180+
break;
181+
}
182+
}
183+
166184
const field = fieldMap[fieldname];
167185

168186
typeCoverage.children[field.name] = {

0 commit comments

Comments
 (0)