Skip to content

Commit 422db40

Browse files
fix: update tests, move environmentConfigManager tests
1 parent a63ea6b commit 422db40

18 files changed

+83
-56
lines changed

sdk/nodejs/__tests__/environmentConfigManager.spec.ts renamed to lib/shared/config-manager/__tests__/environmentConfigManager.spec.ts

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,40 @@
11
jest.mock('../src/request')
22
jest.useFakeTimers()
33
jest.spyOn(global, 'setInterval')
4-
jest.mock('../src/bucketing')
54

6-
import { EnvironmentConfigManager } from '../src/environmentConfigManager'
7-
import { importBucketingLib, getBucketingLib } from '../src/bucketing'
5+
import { EnvironmentConfigManager } from '../src'
86
import { mocked } from 'jest-mock'
97
import { Response } from 'cross-fetch'
10-
import { dvcDefaultLogger, ResponseError } from '@devcycle/js-cloud-server-sdk'
8+
import {
9+
DevCycleOptions,
10+
dvcDefaultLogger,
11+
ResponseError,
12+
} from '@devcycle/js-cloud-server-sdk'
13+
import { DVCLogger } from '@devcycle/types'
1114
import { getEnvironmentConfig } from '../src/request'
1215

1316
const setInterval_mock = mocked(setInterval)
1417
const getEnvironmentConfig_mock = mocked(getEnvironmentConfig)
1518
const logger = dvcDefaultLogger()
1619

20+
const mockSDKConfig = jest.fn()
21+
22+
function getConfigManager(
23+
logger: DVCLogger,
24+
sdkKey: string,
25+
options: DevCycleOptions,
26+
) {
27+
return new EnvironmentConfigManager(
28+
logger,
29+
sdkKey,
30+
mockSDKConfig,
31+
setInterval,
32+
clearInterval,
33+
options,
34+
)
35+
}
36+
1737
describe('EnvironmentConfigManager Unit Tests', () => {
18-
beforeAll(async () => {
19-
await importBucketingLib()
20-
})
2138
beforeEach(() => {
2239
getEnvironmentConfig_mock.mockReset()
2340
setInterval_mock.mockReset()
@@ -43,18 +60,15 @@ describe('EnvironmentConfigManager Unit Tests', () => {
4360
mockFetchResponse({ status: 200 }),
4461
)
4562

46-
const envConfig = new EnvironmentConfigManager(logger, 'sdkKey', {
63+
const envConfig = getConfigManager(logger, 'sdkKey', {
4764
configPollingIntervalMS: 1000,
4865
configPollingTimeoutMS: 1000,
4966
})
5067
await envConfig.fetchConfigPromise
5168
expect(setInterval_mock).toHaveBeenCalledTimes(1)
5269

5370
await envConfig._fetchConfig()
54-
expect(getBucketingLib().setConfigDataUTF8).toHaveBeenCalledWith(
55-
'sdkKey',
56-
Buffer.from('{}', 'utf8'),
57-
)
71+
expect(mockSDKConfig).toHaveBeenCalledWith('sdkKey', '{}')
5872

5973
expect(envConfig).toEqual(
6074
expect.objectContaining({
@@ -72,7 +86,7 @@ describe('EnvironmentConfigManager Unit Tests', () => {
7286
mockFetchResponse({ status: 200 }),
7387
)
7488

75-
const envConfig = new EnvironmentConfigManager(logger, 'sdkKey', {
89+
const envConfig = getConfigManager(logger, 'sdkKey', {
7690
configPollingIntervalMS: 10,
7791
configPollingTimeoutMS: 10000,
7892
})
@@ -97,7 +111,7 @@ describe('EnvironmentConfigManager Unit Tests', () => {
97111
mockFetchResponse({ status: 200 }),
98112
)
99113

100-
const envConfig = new EnvironmentConfigManager(logger, 'sdkKey', {
114+
const envConfig = getConfigManager(logger, 'sdkKey', {
101115
configPollingIntervalMS: 1000,
102116
configPollingTimeoutMS: 1000,
103117
})
@@ -129,7 +143,7 @@ describe('EnvironmentConfigManager Unit Tests', () => {
129143
mockFetchResponse({ status: 500 }),
130144
)
131145

132-
const envConfig = new EnvironmentConfigManager(logger, 'sdkKey', {})
146+
const envConfig = getConfigManager(logger, 'sdkKey', {})
133147
expect(envConfig.fetchConfigPromise).rejects.toThrow(
134148
'Failed to download DevCycle config.',
135149
)
@@ -140,7 +154,7 @@ describe('EnvironmentConfigManager Unit Tests', () => {
140154
mockFetchResponse({ status: 403 }),
141155
)
142156

143-
const envConfig = new EnvironmentConfigManager(logger, 'sdkKey', {})
157+
const envConfig = getConfigManager(logger, 'sdkKey', {})
144158
expect(envConfig.fetchConfigPromise).rejects.toThrow(
145159
'Invalid SDK key provided:',
146160
)
@@ -150,7 +164,7 @@ describe('EnvironmentConfigManager Unit Tests', () => {
150164
it('should throw error fetching config throws', () => {
151165
getEnvironmentConfig_mock.mockRejectedValue(new Error('Error'))
152166

153-
const envConfig = new EnvironmentConfigManager(logger, 'sdkKey', {})
167+
const envConfig = getConfigManager(logger, 'sdkKey', {})
154168
expect(envConfig.fetchConfigPromise).rejects.toThrow(
155169
'Failed to download DevCycle config.',
156170
)
@@ -162,7 +176,7 @@ describe('EnvironmentConfigManager Unit Tests', () => {
162176
mockFetchResponse({ status: 200, data: config }),
163177
)
164178

165-
const envConfig = new EnvironmentConfigManager(logger, 'sdkKey', {
179+
const envConfig = getConfigManager(logger, 'sdkKey', {
166180
configPollingIntervalMS: 1000,
167181
configPollingTimeoutMS: 1000,
168182
})
@@ -184,7 +198,7 @@ describe('EnvironmentConfigManager Unit Tests', () => {
184198
mockFetchResponse({ status: 500 }),
185199
)
186200

187-
const envConfig = new EnvironmentConfigManager(logger, 'sdkKey', {})
201+
const envConfig = getConfigManager(logger, 'sdkKey', {})
188202
await expect(envConfig.fetchConfigPromise).rejects.toThrow()
189203
expect(setInterval_mock).toHaveBeenCalledTimes(1)
190204
})
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
{
22
"name": "@devcycle/config-manager",
33
"version": "0.0.1",
4-
"type": "commonjs"
4+
"type": "commonjs",
5+
"dependencies": {
6+
"@devcycle/js-cloud-server-sdk": "^1.0.0",
7+
"@devcycle/types": "^1.1.15"
8+
}
59
}

lib/shared/config-manager/project.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
"tsConfig": "lib/shared/config-manager/tsconfig.lib.json",
1616
"assets": [
1717
"lib/shared/config-manager/*.md"
18+
],
19+
"external": [
20+
"shared-types",
21+
"js-cloud-server-sdk"
1822
]
1923
}
2024
},

lib/shared/config-manager/src/index.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { DVCLogger } from '@devcycle/types'
2-
// import { getBucketingLib } from './bucketing'
32
// import { UserError } from './utils/userError'
43
import { getEnvironmentConfig } from './request'
54
import { ResponseError, DevCycleOptions } from '@devcycle/js-cloud-server-sdk'
@@ -8,7 +7,10 @@ type ConfigPollingOptions = DevCycleOptions & {
87
cdnURI?: string
98
}
109

11-
type SetConfigBuffer = (sdkKey: string, configBuffer: Buffer) => void
10+
type SetIntervalInterface = (handler: () => void, timeout?: number) => any
11+
type ClearIntervalInterface = (intervalTimeout: any) => void
12+
13+
type SetConfigBuffer = (sdkKey: string, projectConfig: string) => void
1214

1315
export class EnvironmentConfigManager {
1416
private readonly logger: DVCLogger
@@ -19,14 +21,18 @@ export class EnvironmentConfigManager {
1921
private readonly requestTimeoutMS: number
2022
private readonly cdnURI: string
2123
fetchConfigPromise: Promise<void>
22-
private intervalTimeout?: NodeJS.Timeout
24+
private intervalTimeout?: any
2325
private disablePolling = false
2426
private readonly setConfigBuffer: SetConfigBuffer
27+
private readonly setInterval: SetIntervalInterface
28+
private readonly clearInterval: ClearIntervalInterface
2529

2630
constructor(
2731
logger: DVCLogger,
2832
sdkKey: string,
2933
setConfigBuffer: SetConfigBuffer,
34+
setInterval: SetIntervalInterface,
35+
clearInterval: ClearIntervalInterface,
3036
{
3137
configPollingIntervalMS = 10000,
3238
configPollingTimeoutMS = 5000,
@@ -36,7 +42,11 @@ export class EnvironmentConfigManager {
3642
) {
3743
this.logger = logger
3844
this.sdkKey = sdkKey
45+
3946
this.setConfigBuffer = setConfigBuffer
47+
this.setInterval = setInterval
48+
this.clearInterval = clearInterval
49+
4050
this.pollingIntervalMS =
4151
configPollingIntervalMS >= 1000 ? configPollingIntervalMS : 1000
4252
this.requestTimeoutMS =
@@ -53,7 +63,7 @@ export class EnvironmentConfigManager {
5363
if (this.disablePolling) {
5464
return
5565
}
56-
this.intervalTimeout = setInterval(async () => {
66+
this.intervalTimeout = this.setInterval(async () => {
5767
try {
5868
await this._fetchConfig()
5969
} catch (ex) {
@@ -65,7 +75,7 @@ export class EnvironmentConfigManager {
6575

6676
stopPolling(): void {
6777
this.disablePolling = true
68-
clearInterval(this.intervalTimeout)
78+
this.clearInterval(this.intervalTimeout)
6979
}
7080

7181
cleanup(): void {
@@ -124,8 +134,7 @@ export class EnvironmentConfigManager {
124134
} else if (res?.status === 200 && projectConfig) {
125135
try {
126136
const etag = res?.headers.get('etag') || ''
127-
const configBuffer = Buffer.from(projectConfig, 'utf8')
128-
this.setConfigBuffer(this.sdkKey, configBuffer)
137+
this.setConfigBuffer(this.sdkKey, projectConfig)
129138
this.hasConfig = true
130139
this.configEtag = etag
131140
return

lib/shared/config-manager/src/lib/config-manager.spec.ts

Lines changed: 0 additions & 7 deletions
This file was deleted.

lib/shared/config-manager/src/lib/config-manager.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.

lib/shared/config-manager/tsconfig.json

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
11
{
22
"extends": "../../../tsconfig.base.json",
3-
"compilerOptions": {
4-
"module": "commonjs",
5-
"forceConsistentCasingInFileNames": true,
6-
"strict": true,
7-
"noImplicitOverride": true,
8-
"noPropertyAccessFromIndexSignature": true,
9-
"noImplicitReturns": true,
10-
"noFallthroughCasesInSwitch": true
11-
},
123
"files": [],
134
"include": [],
145
"references": [

lib/shared/config-manager/tsconfig.lib.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
"compilerOptions": {
44
"outDir": "../../../dist/out-tsc",
55
"declaration": true,
6-
"lib": ["esnext", "webworker"],
7-
"types": ["node", "@cloudflare/workers-types"]
6+
"types": []
87
},
98
"include": ["src/**/*.ts"],
109
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"]

lib/shared/config-manager/tsconfig.spec.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
"compilerOptions": {
44
"outDir": "../../../dist/out-tsc",
55
"module": "commonjs",
6-
"lib": ["esnext", "webworker"],
7-
"types": ["jest", "node", "@cloudflare/workers-types"]
6+
"types": ["jest", "node"]
87
},
98
"include": [
109
"jest.config.ts",

sdk/nodejs/__tests__/client.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { DevCycleClient } from '../src/client'
44
import { DevCycleUser } from '@devcycle/js-cloud-server-sdk'
55

66
jest.mock('../src/bucketing')
7-
jest.mock('../src/environmentConfigManager')
7+
jest.mock('@devcycle/config-manager')
88
jest.mock('../src/eventQueue')
99

1010
describe('DevCycleClient', () => {

0 commit comments

Comments
 (0)