Skip to content

Commit 6294f94

Browse files
authored
tests(parameters): integration tests for AppConfigProvider (#1287)
* tests: appconfigprovider e2e tests * tests: completed e2e tests * chore: added effect in policy * chore: add missing semicolon * chore: fix indentation * chore: documented explicit dependency
1 parent c672c40 commit 6294f94

5 files changed

+626
-9
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
import { Context } from 'aws-lambda';
2+
import {
3+
AppConfigProvider,
4+
} from '../../src/appconfig';
5+
import {
6+
AppConfigGetOptionsInterface,
7+
} from '../../src/types';
8+
import { TinyLogger } from '../helpers/tinyLogger';
9+
import { middleware } from '../helpers/sdkMiddlewareRequestCounter';
10+
import { AppConfigDataClient } from '@aws-sdk/client-appconfigdata';
11+
12+
// We use a custom logger to log pure JSON objects to stdout
13+
const logger = new TinyLogger();
14+
15+
const application = process.env.APPLICATION_NAME || 'my-app';
16+
const environment = process.env.ENVIRONMENT_NAME || 'my-env';
17+
const freeFormJsonName = process.env.FREEFORM_JSON_NAME || 'freeform-json';
18+
const freeFormYamlName = process.env.FREEFORM_YAML_NAME || 'freeform-yaml';
19+
const freeFormPlainTextNameA = process.env.FREEFORM_PLAIN_TEXT_NAME_A || 'freeform-plain-text';
20+
const freeFormPlainTextNameB = process.env.FREEFORM_PLAIN_TEXT_NAME_B || 'freeform-plain-text';
21+
const featureFlagName = process.env.FEATURE_FLAG_NAME || 'feature-flag';
22+
23+
const defaultProvider = new AppConfigProvider({
24+
application,
25+
environment,
26+
});
27+
// Provider test
28+
const customClient = new AppConfigDataClient({});
29+
customClient.middlewareStack.use(middleware);
30+
const providerWithMiddleware = new AppConfigProvider({
31+
awsSdkV3Client: customClient,
32+
application,
33+
environment,
34+
});
35+
36+
// Use provider specified, or default to main one & return it with cache cleared
37+
const resolveProvider = (provider?: AppConfigProvider): AppConfigProvider => {
38+
const resolvedProvider = provider ? provider : defaultProvider;
39+
resolvedProvider.clearCache();
40+
41+
return resolvedProvider;
42+
};
43+
44+
// Helper function to call get() and log the result
45+
const _call_get = async (
46+
paramName: string,
47+
testName: string,
48+
options?: AppConfigGetOptionsInterface,
49+
provider?: AppConfigProvider,
50+
): Promise<void> => {
51+
try {
52+
const currentProvider = resolveProvider(provider);
53+
54+
const parameterValue = await currentProvider.get(paramName, options);
55+
logger.log({
56+
test: testName,
57+
value: parameterValue
58+
});
59+
} catch (err) {
60+
logger.log({
61+
test: testName,
62+
error: err.message
63+
});
64+
}
65+
};
66+
67+
export const handler = async (_event: unknown, _context: Context): Promise<void> => {
68+
// Test 1 - get a single parameter as-is (no transformation)
69+
await _call_get(freeFormPlainTextNameA, 'get');
70+
71+
// Test 2 - get a free-form JSON and apply binary transformation (should return a stringified JSON)
72+
await _call_get(freeFormJsonName, 'get-freeform-json-binary', { transform: 'binary' });
73+
74+
// Test 3 - get a free-form YAML and apply binary transformation (should return a string-encoded YAML)
75+
await _call_get(freeFormYamlName, 'get-freeform-yaml-binary', { transform: 'binary' });
76+
77+
// Test 4 - get a free-form plain text and apply binary transformation (should return a string)
78+
await _call_get(freeFormPlainTextNameB, 'get-freeform-plain-text-binary', { transform: 'binary' });
79+
80+
// Test 5 - get a feature flag and apply binary transformation (should return a stringified JSON)
81+
await _call_get(featureFlagName, 'get-feature-flag-binary', { transform: 'binary' });
82+
83+
// Test 6
84+
// get parameter twice with middleware, which counts the number of requests, we check later if we only called AppConfig API once
85+
try {
86+
providerWithMiddleware.clearCache();
87+
middleware.counter = 0;
88+
await providerWithMiddleware.get(freeFormPlainTextNameA);
89+
await providerWithMiddleware.get(freeFormPlainTextNameA);
90+
logger.log({
91+
test: 'get-cached',
92+
value: middleware.counter // should be 1
93+
});
94+
} catch (err) {
95+
logger.log({
96+
test: 'get-cached',
97+
error: err.message
98+
});
99+
}
100+
101+
// Test 7
102+
// get parameter twice, but force fetch 2nd time, we count number of SDK requests and check that we made two API calls
103+
try {
104+
providerWithMiddleware.clearCache();
105+
middleware.counter = 0;
106+
await providerWithMiddleware.get(freeFormPlainTextNameA);
107+
await providerWithMiddleware.get(freeFormPlainTextNameA, { forceFetch: true });
108+
logger.log({
109+
test: 'get-forced',
110+
value: middleware.counter // should be 2
111+
});
112+
} catch (err) {
113+
logger.log({
114+
test: 'get-forced',
115+
error: err.message
116+
});
117+
}
118+
};

0 commit comments

Comments
 (0)