Skip to content

Commit 5144aa9

Browse files
committed
wip
1 parent 391e690 commit 5144aa9

3 files changed

Lines changed: 63 additions & 11 deletions

File tree

src/rules/rules.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export function applyRules(recording: ProxyData[], rules: TestRule[]) {
3434
after: [],
3535
})
3636
)
37+
console.log('rules applied', requestSnippetSchemas)
3738

3839
return { requestSnippetSchemas, ruleInstances }
3940
}

src/rules/verification.test.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,5 +297,25 @@ describe('createVerificationRuleInstance', () => {
297297
"'body equals success': (r) => r.body === 'success'"
298298
)
299299
})
300+
301+
it('supports body comparison with recorded value', () => {
302+
const instance = createInstance(
303+
createMockVerificationRule({
304+
target: 'body',
305+
value: { type: 'recordedValue' },
306+
})
307+
)
308+
309+
const mockRequestSnippet = createMockRequestSnippet({
310+
response: { content: 'Operation completed successfully' },
311+
})
312+
313+
const result = instance.apply(mockRequestSnippet)
314+
315+
expect(result.after).toHaveLength(1)
316+
expect(result.after[0]).toContain(
317+
"'body equals recorded value': (r) => r.body.replace(/(?:\\r\\n|\\r|\\n)/g, '') === String.raw`Operation completed successfully`"
318+
)
319+
})
300320
})
301321
})

src/rules/verification.ts

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { exhaustive } from '@/utils/typescript'
55

66
type CheckValue = string | number
77

8+
// TODO: this is redundant
89
function getValueFromRule(
910
rule: VerificationRule,
1011
response: RequestSnippetSchema['data']['response']
@@ -28,19 +29,34 @@ const getExpectedValue = (
2829
rule: VerificationRule,
2930
value: CheckValue
3031
): CheckValue => {
31-
switch (rule.target) {
32-
case 'status':
33-
return rule.value.type === 'variable' ? `Number(${value})` : value
34-
case 'body':
35-
return rule.value.type === 'variable' ? value : `'${value}'`
32+
switch (rule.value.type) {
33+
case 'recordedValue':
34+
return rule.target === 'status'
35+
? value
36+
: `String.raw\`${escapeBackticksAndDollarSign(value.replace(/(?:\r\n|\r|\n)/g, ''))}\``
37+
case 'string':
38+
return rule.target === 'status' ? value : `'${value}'`
39+
case 'variable':
40+
return rule.target === 'status' ? `Number(${value})` : value
3641
default:
37-
return exhaustive(rule.target)
42+
return exhaustive(rule.value)
3843
}
3944
}
4045

46+
function getTarget(rule: VerificationRule) {
47+
const property = rule.target === 'status' ? 'r.status' : 'r.body'
48+
49+
if (rule.value.type === 'recordedValue' && rule.target === 'body') {
50+
return `${property}.replace(/(?:\\r\\n|\\r|\\n)/g, '')`
51+
}
52+
53+
return property
54+
}
55+
4156
function getCheckExpression(rule: VerificationRule, value: CheckValue): string {
42-
const target = rule.target === 'status' ? 'r.status' : 'r.body'
57+
const target = getTarget(rule)
4358
const expectedValue = getExpectedValue(rule, value)
59+
console.log('expectedValue', expectedValue)
4460

4561
switch (rule.operator) {
4662
case 'equals':
@@ -54,14 +70,24 @@ function getCheckExpression(rule: VerificationRule, value: CheckValue): string {
5470
}
5571
}
5672

73+
function getValueDescription(rule: VerificationRule, value: CheckValue) {
74+
switch (rule.value.type) {
75+
case 'recordedValue':
76+
return rule.target === 'body' ? 'recorded value' : value
77+
case 'string':
78+
return value
79+
case 'variable':
80+
return `variable "${rule.value.variableName}"`
81+
default:
82+
return exhaustive(rule.value)
83+
}
84+
}
85+
5786
function getCheckDescription(
5887
rule: VerificationRule,
5988
value: CheckValue
6089
): string {
61-
const valueDescription =
62-
rule.value.type === 'variable'
63-
? `variable "${rule.value.variableName}"`
64-
: value
90+
const valueDescription = getValueDescription(rule, value)
6591

6692
switch (rule.operator) {
6793
case 'equals':
@@ -115,3 +141,8 @@ export function createVerificationRuleInstance(
115141
},
116142
}
117143
}
144+
145+
// Without escaping, backticks and dollar sign break the String.raw template literal
146+
function escapeBackticksAndDollarSign(str: string) {
147+
return str.replace(/\$/g, '${"$"}').replace(/`/g, '${"`"}')
148+
}

0 commit comments

Comments
 (0)