Skip to content

Commit 4764473

Browse files
committed
chore: refactoring test package and its unit tests
1 parent f07a330 commit 4764473

12 files changed

Lines changed: 418 additions & 107 deletions

File tree

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"test:e2e": "pnpm --filter @vscode-wdio/e2e run test:e2e",
3232
"test:smoke": "pnpm --filter @vscode-wdio/e2e run test:smoke",
3333
"coverage": "vitest --run --coverage",
34+
"coverage:ui": "pnpx sirv-cli ./coverage --single",
3435
"graph": "pnpm run build --graph assets/build.png",
3536
"version": "pnpm --filter @vscode-wdio/release run changelog && git add CHANGELOG.md",
3637
"postversion": "git show",
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
/* c8 ignore start */
12
export { RepositoryManager } from './manager.js'
23
export { TestReporter } from './reporter.js'
34
export { TestfileWatcher } from './watcher.js'
5+
/* c8 ignore stop */

packages/vscode-wdio-test/src/manager.ts

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,7 @@ export class RepositoryManager implements IRepositoryManager {
168168
workspaceFolder.name,
169169
workspaceFolder.uri
170170
)
171-
this._metadata.setMetadata(workspaceItem, {
172-
uri: workspaceFolder.uri,
173-
isWorkspace: true,
174-
isConfigFile: false,
175-
isSpecFile: false,
176-
isTestcase: false,
177-
})
171+
this._metadata.createWorkspaceMetadata(workspaceItem, { uri: workspaceFolder.uri })
178172
return workspaceItem
179173
}
180174

@@ -193,27 +187,21 @@ export class RepositoryManager implements IRepositoryManager {
193187
workspaceTestItem.children.add(configItem)
194188
this._wdioConfigTestItems.push(configItem)
195189

196-
const repo = new TestRepository(
190+
const repository = new TestRepository(
197191
this.configManager,
198192
this.controller,
199193
wdioConfigPath,
200194
configItem,
201195
this.workerManager,
202196
workspaceFolder
203197
)
204-
this._repos.add(repo)
198+
this._repos.add(repository)
205199

206200
configItem.description = relative(workspaceTestItem.uri!.fsPath, dirname(wdioConfigPath))
207201

208-
this._metadata.setMetadata(configItem, {
209-
uri,
210-
isWorkspace: false,
211-
isConfigFile: true,
212-
isSpecFile: false,
213-
isTestcase: false,
214-
repository: repo,
215-
runProfiles: createRunProfile.call(this, configItem, !this.isCreatedDefaultProfile),
216-
})
202+
const runProfiles = createRunProfile.call(this, configItem, !this.isCreatedDefaultProfile)
203+
204+
this._metadata.createWdioConfigFileMetadata(configItem, { uri, repository, runProfiles })
217205
return configItem
218206
}
219207

packages/vscode-wdio-test/src/metadata.ts

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import type { IMetadataRepository, TestItemMetadata } from '@vscode-wdio/types/test'
1+
import type { ITestRepository, TestItemMetadata, TestType } from '@vscode-wdio/types/test'
22
import type * as vscode from 'vscode'
33

4-
export class MetadataRepository implements IMetadataRepository {
4+
export class MetadataRepository {
55
private static testMetadataRepository = new WeakMap<vscode.TestItem, TestItemMetadata>()
66
public getMetadata(testItem: vscode.TestItem) {
77
const metadata = MetadataRepository.testMetadataRepository.get(testItem)
@@ -19,7 +19,60 @@ export class MetadataRepository implements IMetadataRepository {
1919
return metadata.repository
2020
}
2121

22-
public setMetadata(testItem: vscode.TestItem, metadata: TestItemMetadata) {
22+
protected setMetadata(testItem: vscode.TestItem, metadata: TestItemMetadata) {
2323
MetadataRepository.testMetadataRepository.set(testItem, metadata)
2424
}
25+
26+
public createTestMetadata(
27+
testItem: vscode.TestItem,
28+
options: { uri: vscode.Uri; repository: ITestRepository; testType: TestType }
29+
) {
30+
this.setMetadata(testItem, {
31+
uri: options.uri,
32+
isWorkspace: false,
33+
isConfigFile: false,
34+
isSpecFile: false,
35+
isTestcase: true,
36+
repository: options.repository,
37+
type: options.testType,
38+
})
39+
}
40+
41+
public createSpecFileMetadata(
42+
testItem: vscode.TestItem,
43+
options: { repository: ITestRepository; uri: vscode.Uri }
44+
) {
45+
this.setMetadata(testItem, {
46+
uri: options.uri,
47+
isWorkspace: false,
48+
isConfigFile: false,
49+
isSpecFile: true,
50+
isTestcase: false,
51+
repository: options.repository,
52+
})
53+
}
54+
public createWdioConfigFileMetadata(
55+
testItem: vscode.TestItem,
56+
options: { repository: ITestRepository; uri: vscode.Uri; runProfiles?: vscode.TestRunProfile[] }
57+
) {
58+
this.setMetadata(testItem, {
59+
uri: options.uri,
60+
isWorkspace: false,
61+
isConfigFile: true,
62+
isSpecFile: false,
63+
isTestcase: false,
64+
repository: options.repository,
65+
runProfiles: options.runProfiles,
66+
})
67+
}
68+
69+
public createWorkspaceMetadata(testItem: vscode.TestItem, options: { uri: vscode.Uri }) {
70+
this.setMetadata(testItem, {
71+
uri: options.uri,
72+
isWorkspace: true,
73+
isConfigFile: false,
74+
isSpecFile: false,
75+
isTestcase: false,
76+
})
77+
}
2578
}

packages/vscode-wdio-test/src/repository.ts

Lines changed: 8 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,10 @@ import { log } from '@vscode-wdio/logger'
55
import { getEnvOptions, normalizePath } from '@vscode-wdio/utils'
66
import * as vscode from 'vscode'
77

8-
import { convertSourceRangeToVSCodeRange } from './converter.js'
98
import { MetadataRepository } from './metadata.js'
10-
import { filterSpecsByPaths } from './utils.js'
11-
import type { IExtensionConfigManager } from '@vscode-wdio/types'
9+
import { filterSpecsByPaths, testTreeCreator } from './utils.js'
1210

13-
import type { IWorkerManager, IWdioExtensionWorker } from '@vscode-wdio/types/server'
14-
import type { ITestRepository, TestData } from '@vscode-wdio/types/test'
11+
import type { IExtensionConfigManager, IWorkerManager, IWdioExtensionWorker, ITestRepository } from '@vscode-wdio/types'
1512

1613
class WorkerMiddleware {
1714
private _worker: IWdioExtensionWorker | undefined
@@ -208,34 +205,13 @@ export class TestRepository extends WorkerMiddleware implements ITestRepository
208205
// Create TestItem testFile by testFile
209206
const fileId = this.getTestFileId(this._wdioConfigTestItem, test.spec)
210207

211-
const uri = vscode.Uri.file(test.spec)
208+
const specFileUri = vscode.Uri.file(test.spec)
212209

213-
const fileTestItem = this.resisterSpecFile(fileId, uri)
214-
215-
const testTreeCreator = (parentId: string, testCase: TestData) => {
216-
const testCaseId = `${parentId}${TEST_ID_SEPARATOR}${testCase.name}`
217-
218-
const testCaseItem = this.controller.createTestItem(testCaseId, testCase.name, uri)
219-
220-
this._metadata.setMetadata(testCaseItem, {
221-
uri,
222-
isWorkspace: false,
223-
isConfigFile: false,
224-
isSpecFile: false,
225-
isTestcase: true,
226-
repository: this,
227-
type: testCase.type,
228-
})
229-
230-
testCaseItem.range = convertSourceRangeToVSCodeRange(testCase.range)
231-
232-
for (const childTestCase of testCase.children) {
233-
testCaseItem.children.add(testTreeCreator(testCaseId, childTestCase))
234-
}
235-
return testCaseItem
236-
}
210+
const fileTestItem = this.resisterSpecFile(fileId, specFileUri)
237211
for (const testCase of test.tests) {
238-
fileTestItem.children.add(testTreeCreator(fileId, testCase))
212+
fileTestItem.children.add(
213+
testTreeCreator(this, this._metadata, fileId, testCase, specFileUri)
214+
)
239215
}
240216
return fileTestItem
241217
} catch (error) {
@@ -305,14 +281,7 @@ export class TestRepository extends WorkerMiddleware implements ITestRepository
305281
const fileTestItem = this.controller.createTestItem(id, path.basename(uri.fsPath), uri)
306282
fileTestItem.sortText = uri.fsPath
307283

308-
this._metadata.setMetadata(fileTestItem, {
309-
uri,
310-
isWorkspace: false,
311-
isConfigFile: false,
312-
isSpecFile: true,
313-
isTestcase: false,
314-
repository: this,
315-
})
284+
this._metadata.createSpecFileMetadata(fileTestItem, { uri, repository: this })
316285
this._fileMap.set(id, fileTestItem)
317286
return fileTestItem
318287
}

packages/vscode-wdio-test/src/utils.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import * as path from 'node:path'
22

3+
import { TEST_ID_SEPARATOR } from '@vscode-wdio/constants'
34
import * as vscode from 'vscode'
45

6+
import { convertSourceRangeToVSCodeRange } from './converter.js'
57
import { createHandler } from './runHandler.js'
6-
import type { IExtensionConfigManager } from '@vscode-wdio/types/config'
8+
9+
import type { IExtensionConfigManager, ITestRepository, TestData } from '@vscode-wdio/types'
710
import type { RepositoryManager } from './manager.js'
11+
import type { MetadataRepository } from './metadata.js'
812

913
/**
1014
* Filter spec files by paths
@@ -86,3 +90,28 @@ function getWorkspace(uri: vscode.Uri) {
8690
}
8791
return workspace
8892
}
93+
94+
export function testTreeCreator(
95+
repository: ITestRepository,
96+
metadata: MetadataRepository,
97+
parentId: string,
98+
testCase: TestData,
99+
uri: vscode.Uri
100+
) {
101+
const testCaseId = `${parentId}${TEST_ID_SEPARATOR}${testCase.name}`
102+
103+
const testCaseItem = repository.controller.createTestItem(testCaseId, testCase.name, uri)
104+
105+
metadata.createTestMetadata(testCaseItem, {
106+
uri,
107+
repository,
108+
testType: testCase.type,
109+
})
110+
111+
testCaseItem.range = convertSourceRangeToVSCodeRange(testCase.range)
112+
113+
for (const childTestCase of testCase.children) {
114+
testCaseItem.children.add(testTreeCreator(repository, metadata, testCaseId, childTestCase, uri))
115+
}
116+
return testCaseItem
117+
}

packages/vscode-wdio-test/tests/converter.test.ts

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,52 @@ import { join } from 'node:path'
33
import { describe, it, expect, vi } from 'vitest'
44
import * as vscode from 'vscode'
55

6-
import { convertPathToUri, isCucumberFeatureFile } from '../src/converter.js'
6+
import { convertPathToUri, convertSourceRangeToVSCodeRange, isCucumberFeatureFile } from '../src/converter.js'
77

88
// Mock dependencies
99
vi.mock('vscode', () => import('../../../tests/__mocks__/vscode.cjs'))
1010
vi.mock('@vscode-wdio/logger', () => import('../../../tests/__mocks__/logger.js'))
1111

12-
describe('Converter', () => {
13-
describe('convertPathToUri', () => {
14-
it('should convert file path to VSCode URI', () => {
15-
const filePath = join(process.cwd(), 'path', 'to', 'spec.js')
16-
const result = convertPathToUri(filePath)
12+
describe('convertSourceRangeToVSCodeRange', () => {
13+
it('should convert range to VSCode.Range', () => {
14+
const sourceRange = {
15+
start: {
16+
line: 1,
17+
column: 1,
18+
},
19+
end: {
20+
line: 10,
21+
column: 10,
22+
},
23+
}
24+
const result = convertSourceRangeToVSCodeRange(sourceRange)
1725

18-
expect(result.scheme).toEqual('file')
19-
expect(result.fsPath).toEqual(vscode.Uri.file(filePath).fsPath)
20-
})
26+
expect(result.start.line).toEqual(1)
27+
expect(result.end.line).toEqual(10)
28+
})
29+
})
30+
31+
describe('convertPathToUri', () => {
32+
it('should convert file path to VSCode URI', () => {
33+
const filePath = join(process.cwd(), 'path', 'to', 'spec.js')
34+
const result = convertPathToUri(filePath)
35+
36+
expect(result.scheme).toEqual('file')
37+
expect(result.fsPath).toEqual(vscode.Uri.file(filePath).fsPath)
38+
})
39+
})
40+
41+
describe('isCucumberFeatureFile', () => {
42+
it('should return true for .feature files', () => {
43+
expect(isCucumberFeatureFile('/path/to/test.feature')).toBe(true)
44+
expect(isCucumberFeatureFile('/path/to/TEST.FEATURE')).toBe(true)
45+
expect(isCucumberFeatureFile('test.feature')).toBe(true)
2146
})
2247

23-
describe('isCucumberFeatureFile', () => {
24-
it('should return true for .feature files', () => {
25-
expect(isCucumberFeatureFile('/path/to/test.feature')).toBe(true)
26-
expect(isCucumberFeatureFile('/path/to/TEST.FEATURE')).toBe(true)
27-
expect(isCucumberFeatureFile('test.feature')).toBe(true)
28-
})
29-
30-
it('should return false for non-feature files', () => {
31-
expect(isCucumberFeatureFile('/path/to/test.js')).toBe(false)
32-
expect(isCucumberFeatureFile('/path/to/test.ts')).toBe(false)
33-
expect(isCucumberFeatureFile('/path/to/test.featurex')).toBe(false)
34-
expect(isCucumberFeatureFile('/path/to/test')).toBe(false)
35-
})
48+
it('should return false for non-feature files', () => {
49+
expect(isCucumberFeatureFile('/path/to/test.js')).toBe(false)
50+
expect(isCucumberFeatureFile('/path/to/test.ts')).toBe(false)
51+
expect(isCucumberFeatureFile('/path/to/test.featurex')).toBe(false)
52+
expect(isCucumberFeatureFile('/path/to/test')).toBe(false)
3653
})
3754
})

0 commit comments

Comments
 (0)