From 88616810ecc256e4535c50505cb151d198e92b57 Mon Sep 17 00:00:00 2001 From: Nikita Korevo <48645737+NikitaKorevo@users.noreply.github.com> Date: Sun, 14 Jun 2026 22:21:51 +0300 Subject: [PATCH 1/3] test: fix tests for Windows --- .../app/services/generator.service.spec.ts | 41 ++++++++++--------- .../services/version-manager.service.spec.ts | 25 +++++------ 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/apps/generator-cli/src/app/services/generator.service.spec.ts b/apps/generator-cli/src/app/services/generator.service.spec.ts index bbd21eb0b88..93338ce87c1 100644 --- a/apps/generator-cli/src/app/services/generator.service.spec.ts +++ b/apps/generator-cli/src/app/services/generator.service.spec.ts @@ -1,3 +1,4 @@ +import { delimiter, resolve } from 'path'; import { Test } from '@nestjs/testing'; import { GeneratorService } from './generator.service'; import { LOGGER } from '../constants'; @@ -134,18 +135,18 @@ describe('GeneratorService', () => { const cmd = (name, appendix: string[]) => ({ name, command: `java -jar "/path/to/4.2.1.jar" generate ${appendix.join( - ' ' + ' ', )}`, }); const cmdWithCustomJar = ( name: string, customJar: string, - appendix: string[] + appendix: string[], ) => ({ name, - command: `java -cp "/path/to/4.2.1.jar:${customJar}" org.openapitools.codegen.OpenAPIGenerator generate ${appendix.join( - ' ' + command: `java -cp "/path/to/4.2.1.jar${delimiter}${customJar}" org.openapitools.codegen.OpenAPIGenerator generate ${appendix.join( + ' ', )}`, }); @@ -154,25 +155,25 @@ describe('GeneratorService', () => { 'foo.json', [ cmd('[angular] abc/app/pet.yaml', [ - `--input-spec="${cwd}/abc/app/pet.yaml"`, + `--input-spec="${resolve(cwd, 'abc/app/pet.yaml')}"`, `--output="${cwd}/generated-sources/openapi/typescript-angular/pet"`, `--generator-name="typescript-angular"`, `--additional-properties="fileNaming=kebab-case,apiModulePrefix=Pet,npmName=petRestClient,supportsES6=true,withInterfaces=true"`, ]), cmd('[angular] abc/app/car.yaml', [ - `--input-spec="${cwd}/abc/app/car.yaml"`, + `--input-spec="${resolve(cwd, 'abc/app/car.yaml')}"`, `--output="${cwd}/generated-sources/openapi/typescript-angular/car"`, `--generator-name="typescript-angular"`, `--additional-properties="fileNaming=kebab-case,apiModulePrefix=Car,npmName=carRestClient,supportsES6=true,withInterfaces=true"`, ]), cmd('[baz] def/app/pet.yaml', [ - `--input-spec="${cwd}/def/app/pet.yaml"`, + `--input-spec="${resolve(cwd, 'def/app/pet.yaml')}"`, `--name="pet"`, `--name-uc-first="Pet"`, `--cwd="${cwd}"`, `--base="pet.yaml"`, - `--dir="${cwd}/def/app"`, - `--path="${cwd}/def/app/pet.yaml"`, + `--dir="${resolve(cwd, 'def/app')}"`, + `--path="${resolve(cwd, 'def/app/pet.yaml')}"`, `--rel-dir="def/app"`, `--rel-path="def/app/pet.yaml"`, `--ext="yaml"`, @@ -180,13 +181,13 @@ describe('GeneratorService', () => { '--some-int=1', ]), cmd('[baz] def/app/car.json', [ - `--input-spec="${cwd}/def/app/car.json"`, + `--input-spec="${resolve(cwd, 'def/app/car.json')}"`, `--name="car"`, `--name-uc-first="Car"`, `--cwd="${cwd}"`, `--base="car.json"`, - `--dir="${cwd}/def/app"`, - `--path="${cwd}/def/app/car.json"`, + `--dir="${resolve(cwd, 'def/app')}"`, + `--path="${resolve(cwd, 'def/app/car.json')}"`, `--rel-dir="def/app"`, `--rel-path="def/app/car.json"`, `--ext="json"`, @@ -199,12 +200,12 @@ describe('GeneratorService', () => { 'bar.json', [ cmd('[bar] api/cat.yaml', [ - `--input-spec="${cwd}/api/cat.yaml"`, + `--input-spec="${resolve(cwd, 'api/cat.yaml')}"`, `--output="bar/cat"`, '--some-bool', ]), cmd('[bar] api/bird.json', [ - `--input-spec="${cwd}/api/bird.json"`, + `--input-spec="${resolve(cwd, 'api/bird.json')}"`, `--output="bar/bird"`, '--some-bool', ]), @@ -214,12 +215,12 @@ describe('GeneratorService', () => { 'bar.json', [ cmdWithCustomJar('[bar] api/cat.yaml', '../some/custom.jar', [ - `--input-spec="${cwd}/api/cat.yaml"`, + `--input-spec="${resolve(cwd, 'api/cat.yaml')}"`, `--output="bar/cat"`, '--some-bool', ]), cmdWithCustomJar('[bar] api/bird.json', '../some/custom.jar', [ - `--input-spec="${cwd}/api/bird.json"`, + `--input-spec="${resolve(cwd, 'api/bird.json')}"`, `--output="bar/bird"`, '--some-bool', ]), @@ -251,7 +252,7 @@ describe('GeneratorService', () => { beforeEach(async () => { configGet.mockImplementation( - (path, defaultValue) => config[filePath] || defaultValue + (path, defaultValue) => config[filePath] || defaultValue, ); returnValue = await fixture.generate(customGenerator); }); @@ -260,7 +261,7 @@ describe('GeneratorService', () => { expect(configGet).toHaveBeenNthCalledWith( 1, 'generator-cli.generators', - {} + {}, ); }); @@ -296,11 +297,11 @@ describe('GeneratorService', () => { expect(executedCommands).toEqual([ { name: '[bar] api/cat.yaml', - command: `java -jar "../some/custom.jar" generate --input-spec="${cwd}/api/cat.yaml" --output="bar/cat" --some-bool`, + command: `java -jar "../some/custom.jar" generate --input-spec="${resolve(cwd, 'api/cat.yaml')}" --output="bar/cat" --some-bool`, }, { name: '[bar] api/bird.json', - command: `java -jar "../some/custom.jar" generate --input-spec="${cwd}/api/bird.json" --output="bar/bird" --some-bool`, + command: `java -jar "../some/custom.jar" generate --input-spec="${resolve(cwd, 'api/bird.json')}" --output="bar/bird" --some-bool`, }, ]); }); diff --git a/apps/generator-cli/src/app/services/version-manager.service.spec.ts b/apps/generator-cli/src/app/services/version-manager.service.spec.ts index 3e93f05e90a..58a00ffc246 100644 --- a/apps/generator-cli/src/app/services/version-manager.service.spec.ts +++ b/apps/generator-cli/src/app/services/version-manager.service.spec.ts @@ -5,10 +5,9 @@ import { of } from 'rxjs'; import { LOGGER } from '../constants'; import chalk from 'chalk'; import { ConfigService } from './config.service'; -import { resolve } from 'path'; +import { join, normalize, resolve } from 'path'; import * as os from 'os'; import { TestingModule } from '@nestjs/testing/testing-module'; -import * as path from 'path'; jest.mock('fs-extra'); @@ -328,7 +327,7 @@ describe('VersionManagerService', () => { it('removes the correct file', () => { expect(fs.removeSync).toHaveBeenNthCalledWith( 1, - `${fixture.storage}/4.3.1.jar`, + resolve(fixture.storage, '4.3.1.jar'), ); }); @@ -446,7 +445,7 @@ describe('VersionManagerService', () => { before: [chalk.yellow(`Download 4.2.0 ...`)], after: [ chalk.green( - `Downloaded 4.2.0 to custom storage location ${expected}`, + `Downloaded 4.2.0 to custom storage location ${resolve(expected)}`, ), ], }); @@ -473,22 +472,22 @@ describe('VersionManagerService', () => { it('creates a temporary directory', () => { expect(fs.mkdtempSync).toHaveBeenNthCalledWith( 1, - path.join(os.tmpdir(), 'generator-cli-'), + join(os.tmpdir(), 'generator-cli-'), ); }); it('creates the correct write stream', () => { expect(fs.createWriteStream).toHaveBeenNthCalledWith( 1, - '/tmp/generator-cli-abcDEF/4.2.0', + normalize('/tmp/generator-cli-abcDEF/4.2.0'), ); }); it('moves the file to the target location', () => { expect(fs.moveSync).toHaveBeenNthCalledWith( 1, - '/tmp/generator-cli-abcDEF/4.2.0', - `${fixture.storage}/4.2.0.jar`, + normalize('/tmp/generator-cli-abcDEF/4.2.0'), + resolve(fixture.storage, '4.2.0.jar'), { overwrite: true }, ); }); @@ -563,7 +562,7 @@ describe('VersionManagerService', () => { fixture.isDownloaded('4.3.1'); expect(fs.existsSync).toHaveBeenNthCalledWith( 1, - fixture.storage + '/4.3.1.jar', + resolve(fixture.storage, '4.3.1.jar'), ); }); }); @@ -571,12 +570,14 @@ describe('VersionManagerService', () => { describe('filePath()', () => { it('returns the path to the given version name', () => { expect(fixture.filePath('1.2.3')).toEqual( - `${fixture.storage}/1.2.3.jar`, + resolve(fixture.storage, '1.2.3.jar'), ); }); it('returns the path to the selected version name as default', () => { - expect(fixture.filePath()).toEqual(`${fixture.storage}/4.3.0.jar`); + expect(fixture.filePath()).toEqual( + resolve(fixture.storage, '4.3.0.jar'), + ); }); }); @@ -597,7 +598,7 @@ describe('VersionManagerService', () => { ])('returns %s for %s', async (expected, cfgValue) => { getStorageDir.mockReturnValue(cfgValue); await compile(); - expect(fixture.storage).toEqual(expected); + expect(fixture.storage).toEqual(resolve(expected)); }); }); }); From 02b42e830eb50bba4d496e73c69016ee9c69c091 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Sat, 20 Jun 2026 21:06:10 +0800 Subject: [PATCH 2/3] chore(test): update workflow to test with windows --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 00d2944aeca..c3822c30e09 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -53,7 +53,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest, macos-latest, windows-latest] node-version: [ 22.x ] steps: From de7ef5d2fdc4b25319d9c537d2ff8bd76c7664d6 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Sat, 20 Jun 2026 21:11:52 +0800 Subject: [PATCH 3/3] chore(test): update workflow to test with windows --- .github/workflows/build-windows.yml | 126 ++++++++++++++++++++++++++++ .github/workflows/build.yml | 2 +- 2 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/build-windows.yml diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml new file mode 100644 index 00000000000..e6fa1b74e85 --- /dev/null +++ b/.github/workflows/build-windows.yml @@ -0,0 +1,126 @@ +name: Build +on: + push: + tags-ignore: + - '*.*' + branches-ignore: + - master + - renovate/** + pull_request: + types: [ assigned, opened, synchronize, reopened ] +jobs: + build: + name: Build + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [ 22.x ] + + steps: + - name: Checkout + uses: actions/checkout@v7 + + - name: Use Node.js ${{matrix.node-version }} + uses: actions/setup-node@v6 + with: + node-version: ${{matrix.node-version }} + + - name: Install + run: yarn --frozen-lockfile + + - name: Lint + run: yarn run lint + + - name: Unit Test + run: yarn run test + + - name: Build + run: yarn run build + + - name: Build Package + run: | + cd dist/apps/generator-cli + yarn pack -f ../package.tgz + + - uses: actions/upload-artifact@v7 + with: + name: package.tgz + path: dist/apps/package.tgz + + e2e: + name: "E2E local: (${{ matrix.os }})" + needs: build + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [windows-latest] + node-version: [ 22.x ] + + steps: + - name: Checkout + uses: actions/checkout@v7 + + - name: Use Node.js ${{matrix.node-version }} + uses: actions/setup-node@v6 + with: + node-version: ${{matrix.node-version }} + + - uses: actions/download-artifact@v8 + with: + name: package.tgz + + - name: Test + run: | + cd examples + yarn global add json + yarn cache clean && yarn add $GITHUB_WORKSPACE/package.tgz + npm run oa version + npm run oa completion + npm run oa help + npm run oa help generate + npm run oa version-manager help + npm run oa generate -- -g ruby -i https://raw.githubusercontent.com/OpenAPITools/openapi-generator/master/modules/openapi-generator/src/test/resources/3_0/petstore.yaml -o $GITHUB_WORKSPACE/tmp/ruby-client + (npm run oa version-manager set 3.0.0 && npm run oa version | grep -q '3.0.0') || exit 1 + (npm run oa version-manager set 6.0 && npm run oa version | grep -q '6.0.1') || exit 1 + (npm run oa version-manager set 4.3.1 && npm run oa version | grep -q '4.3.1') || exit 1 + (npm run oa version-manager set 4.3.1 && npm run oa version | grep -q '4.3.1') || exit 1 + (export OPENAPI_GENERATOR_CLI_SEARCH_URL=DEFAULT && npm run oa version-manager set 7.2.0 && npm run oa version | grep -q '7.2.0') || exit 1 + json -I -f openapitools.json -e 'this["generator-cli"]["storageDir"]="./my/storage/"' + (npm run oa version-manager set 4.3.0 && npm run oa version | grep -q '4.3.0') || exit 1 + test -f ./my/storage/4.3.0.jar || exit 1 + json -I -f openapitools.json -e 'this["generator-cli"]["storageDir"]="~/my/storage/"' + (npm run oa version-manager set 4.3.1 && npm run oa version | grep -q '4.3.1') || exit 1 + test -f ~/my/storage/4.3.1.jar || exit 1 + npm run oa:generate && mkdir ./foo && cd ./foo && npm run oa:generate + #- name: Test with HTTP proxy + # run: | + # cd ./examples + # yarn global add json && export PATH="$(yarn global bin):$PATH" + # yarn cache clean && yarn add $GITHUB_WORKSPACE/package.tgz + # export HTTP_PROXY=http://proxy_ip:proxy_port + # npm run oa generate -- -g ruby -i https://raw.githubusercontent.com/OpenAPITools/openapi-generator/master/modules/openapi-generator/src/test/resources/3_0/petstore.yaml -o $GITHUB_WORKSPACE/tmp/ruby-client +# rel#ease: +# if: github.event.pull_request.merged == 'true' +# name: Release (Dry) +# # needs: e2e # DONT FORGET TO ENABLE ME !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# runs-on: ubuntu-18.04 +# steps: +# +# - name: Checkout +# uses: actions/checkout@v2 +# with: +# fetch-depth: 0 +# +# - name: Use Node.js ${{matrix.node-version }} +# uses: actions/setup-node@v1 +# with: +# node-version: ${{matrix.node-version }} +# +# - name: Install +# run: yarn --frozen-lockfile +# +# - name: Release +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# NPM_TOKEN: ${{ secrets.NPM_TOKEN }} +# run: npx semantic-release -d diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c3822c30e09..00d2944aeca 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -53,7 +53,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, macos-latest, windows-latest] + os: [ubuntu-latest, macos-latest] node-version: [ 22.x ] steps: