Update unit-tests

This commit is contained in:
IvanZosimov 2023-05-11 09:51:32 +02:00
parent d1558ba62e
commit 595c6fb023
4 changed files with 355 additions and 320 deletions

View File

@ -24,7 +24,7 @@ jobs:
- name: Clear toolcache - name: Clear toolcache
shell: pwsh shell: pwsh
run: __tests__/clear-toolcache.ps1 ${{ runner.os }} run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
- name: Setup dotnet 2.2.402 and 3.1.404 - name: Setup dotnet 2.2.402, 3.1.404 and 3.0.x
uses: ./ uses: ./
with: with:
dotnet-version: | dotnet-version: |

View File

@ -93,7 +93,7 @@ describe('authutil tests', () => {
it('No existing config, sets up a full NuGet.config with URL and user/PAT for GPR', async () => { it('No existing config, sets up a full NuGet.config with URL and user/PAT for GPR', async () => {
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
await auth.configAuthentication( auth.configAuthentication(
'https://nuget.pkg.github.com/OwnerName/index.json', 'https://nuget.pkg.github.com/OwnerName/index.json',
'', '',
fakeSourcesDirForTesting fakeSourcesDirForTesting
@ -107,7 +107,7 @@ describe('authutil tests', () => {
it('No existing config, auth token environment variable not provided, throws', async () => { it('No existing config, auth token environment variable not provided, throws', async () => {
let thrown = false; let thrown = false;
try { try {
await auth.configAuthentication( auth.configAuthentication(
'https://nuget.pkg.github.com/OwnerName/index.json', 'https://nuget.pkg.github.com/OwnerName/index.json',
'', '',
fakeSourcesDirForTesting fakeSourcesDirForTesting
@ -121,7 +121,7 @@ describe('authutil tests', () => {
it('No existing config, sets up a full NuGet.config with URL and other owner/PAT for GPR', async () => { it('No existing config, sets up a full NuGet.config with URL and other owner/PAT for GPR', async () => {
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
process.env['INPUT_OWNER'] = 'otherorg'; process.env['INPUT_OWNER'] = 'otherorg';
await auth.configAuthentication( auth.configAuthentication(
'https://nuget.pkg.github.com/otherorg/index.json', 'https://nuget.pkg.github.com/otherorg/index.json',
'', '',
fakeSourcesDirForTesting fakeSourcesDirForTesting
@ -141,7 +141,7 @@ describe('authutil tests', () => {
fs.writeFileSync(inputNuGetConfigPath, invalidNuGetConfig); fs.writeFileSync(inputNuGetConfigPath, invalidNuGetConfig);
let thrown = false; let thrown = false;
try { try {
await auth.configAuthentication( auth.configAuthentication(
'https://nuget.pkg.github.com/OwnerName/index.json', 'https://nuget.pkg.github.com/OwnerName/index.json',
'', '',
fakeSourcesDirForTesting fakeSourcesDirForTesting
@ -159,7 +159,7 @@ describe('authutil tests', () => {
'nuget.config' 'nuget.config'
); );
fs.writeFileSync(inputNuGetConfigPath, emptyNuGetConfig); fs.writeFileSync(inputNuGetConfigPath, emptyNuGetConfig);
await auth.configAuthentication( auth.configAuthentication(
'https://nuget.pkg.github.com/OwnerName/index.json', 'https://nuget.pkg.github.com/OwnerName/index.json',
'', '',
fakeSourcesDirForTesting fakeSourcesDirForTesting
@ -177,7 +177,7 @@ describe('authutil tests', () => {
'nuget.config' 'nuget.config'
); );
fs.writeFileSync(inputNuGetConfigPath, nugetorgNuGetConfig); fs.writeFileSync(inputNuGetConfigPath, nugetorgNuGetConfig);
await auth.configAuthentication( auth.configAuthentication(
'https://nuget.pkg.github.com/OwnerName/index.json', 'https://nuget.pkg.github.com/OwnerName/index.json',
'', '',
fakeSourcesDirForTesting fakeSourcesDirForTesting
@ -195,7 +195,7 @@ describe('authutil tests', () => {
'nuget.config' 'nuget.config'
); );
fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig); fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig);
await auth.configAuthentication( auth.configAuthentication(
'https://nuget.pkg.github.com/OwnerName/index.json', 'https://nuget.pkg.github.com/OwnerName/index.json',
'', '',
fakeSourcesDirForTesting fakeSourcesDirForTesting
@ -213,7 +213,7 @@ describe('authutil tests', () => {
'nuget.config' 'nuget.config'
); );
fs.writeFileSync(inputNuGetConfigPath, gprnugetorgNuGetConfig); fs.writeFileSync(inputNuGetConfigPath, gprnugetorgNuGetConfig);
await auth.configAuthentication( auth.configAuthentication(
'https://nuget.pkg.github.com/OwnerName/index.json', 'https://nuget.pkg.github.com/OwnerName/index.json',
'', '',
fakeSourcesDirForTesting fakeSourcesDirForTesting
@ -231,7 +231,7 @@ describe('authutil tests', () => {
'nuget.config' 'nuget.config'
); );
fs.writeFileSync(inputNuGetConfigPath, twogprNuGetConfig); fs.writeFileSync(inputNuGetConfigPath, twogprNuGetConfig);
await auth.configAuthentication( auth.configAuthentication(
'https://nuget.pkg.github.com', 'https://nuget.pkg.github.com',
'', '',
fakeSourcesDirForTesting fakeSourcesDirForTesting
@ -251,7 +251,7 @@ describe('authutil tests', () => {
fs.writeFileSync(inputNuGetConfigPath, spaceNuGetConfig); fs.writeFileSync(inputNuGetConfigPath, spaceNuGetConfig);
let thrown = false; let thrown = false;
try { try {
await auth.configAuthentication( auth.configAuthentication(
'https://nuget.pkg.github.com/OwnerName/index.json', 'https://nuget.pkg.github.com/OwnerName/index.json',
'', '',
fakeSourcesDirForTesting fakeSourcesDirForTesting
@ -274,7 +274,7 @@ describe('authutil tests', () => {
); );
fs.mkdirSync(inputNuGetConfigDirectory, {recursive: true}); fs.mkdirSync(inputNuGetConfigDirectory, {recursive: true});
fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig); fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig);
await auth.configAuthentication( auth.configAuthentication(
'https://nuget.pkg.github.com/OwnerName/index.json', 'https://nuget.pkg.github.com/OwnerName/index.json',
'subfolder/nuget.config', 'subfolder/nuget.config',
fakeSourcesDirForTesting fakeSourcesDirForTesting
@ -292,7 +292,7 @@ describe('authutil tests', () => {
'nuget.config' 'nuget.config'
); );
fs.writeFileSync(inputNuGetConfigPath, azureartifactsNuGetConfig); fs.writeFileSync(inputNuGetConfigPath, azureartifactsNuGetConfig);
await auth.configAuthentication( auth.configAuthentication(
'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json', 'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
'', '',
fakeSourcesDirForTesting fakeSourcesDirForTesting
@ -310,7 +310,7 @@ describe('authutil tests', () => {
'nuget.config' 'nuget.config'
); );
fs.writeFileSync(inputNuGetConfigPath, azureartifactsnugetorgNuGetConfig); fs.writeFileSync(inputNuGetConfigPath, azureartifactsnugetorgNuGetConfig);
await auth.configAuthentication( auth.configAuthentication(
'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json', 'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
'', '',
fakeSourcesDirForTesting fakeSourcesDirForTesting
@ -323,7 +323,7 @@ describe('authutil tests', () => {
it('No existing config, sets up a full NuGet.config with URL and token for other source', async () => { it('No existing config, sets up a full NuGet.config with URL and token for other source', async () => {
process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN';
await auth.configAuthentication( auth.configAuthentication(
'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json', 'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json',
'', '',
fakeSourcesDirForTesting fakeSourcesDirForTesting

View File

@ -32,12 +32,13 @@ describe('csc tests', () => {
} }
]; ];
stringsToMatch.forEach((string, index) => { stringsToMatch.map((string, index) => {
const matchedResult = string.match(regex); const matchedResultsArray = string.match(regex);
for (const name in expectedResults[index]) { for (const propName in expectedResults[index]) {
expect(matchedResult![regexResultsMap[name]]).toEqual( const propertyIndex = regexResultsMap[propName];
expectedResults[index][name] const expectedPropValue = expectedResults[index][propName];
); const matchedPropValue = matchedResultsArray![propertyIndex];
expect(matchedPropValue).toEqual(expectedPropValue);
} }
}); });
}, 10000); }, 10000);

View File

@ -8,134 +8,70 @@ import * as installer from '../src/installer';
import {IS_WINDOWS} from '../src/utils'; import {IS_WINDOWS} from '../src/utils';
import {QualityOptions} from '../src/setup-dotnet'; import {QualityOptions} from '../src/setup-dotnet';
const env = process.env; describe('installer tests', () => {
const env = process.env;
beforeEach(() => { beforeEach(() => {
jest.resetModules(); jest.resetModules();
process.env = {...env}; process.env = {...env};
}); });
afterEach(() => { afterEach(() => {
process.env = env; process.env = env;
}); });
describe('DotnetCoreInstaller tests', () => { describe('DotnetCoreInstaller tests', () => {
const getExecOutputSpy = jest.spyOn(exec, 'getExecOutput'); const getExecOutputSpy = jest.spyOn(exec, 'getExecOutput');
const warningSpy = jest.spyOn(core, 'warning'); const warningSpy = jest.spyOn(core, 'warning');
const whichSpy = jest.spyOn(io, 'which'); const whichSpy = jest.spyOn(io, 'which');
const maxSatisfyingSpy = jest.spyOn(semver, 'maxSatisfying'); const maxSatisfyingSpy = jest.spyOn(semver, 'maxSatisfying');
describe('installDotnet() tests', () => { describe('installDotnet() tests', () => {
whichSpy.mockImplementation(() => Promise.resolve('PathToShell')); whichSpy.mockImplementation(() => Promise.resolve('PathToShell'));
it('should throw the error in case of non-zero exit code of the installation script. The error message should contain logs.', async () => { it('should throw the error in case of non-zero exit code of the installation script. The error message should contain logs.', async () => {
const inputVersion = '3.1.100'; const inputVersion = '3.1.100';
const inputQuality = '' as QualityOptions; const inputQuality = '' as QualityOptions;
const errorMessage = 'Fictious error message!'; const errorMessage = 'Fictious error message!';
getExecOutputSpy.mockImplementation(() => {
return Promise.resolve({exitCode: 1, stdout: '', stderr: errorMessage});
});
const dotnetInstaller = new installer.DotnetCoreInstaller(
inputVersion,
inputQuality
);
await expect(dotnetInstaller.installDotnet()).rejects.toThrow(
`Failed to install dotnet, exit code: 1. ${errorMessage}`
);
});
it('should return version of .NET SDK after installation complete', async () => {
const inputVersion = '3.1.100';
const inputQuality = '' as QualityOptions;
getExecOutputSpy.mockImplementation(() => {
return Promise.resolve({exitCode: 0, stdout: '', stderr: ''});
});
maxSatisfyingSpy.mockImplementation(() => inputVersion);
const dotnetInstaller = new installer.DotnetCoreInstaller(
inputVersion,
inputQuality
);
const installedVersion = await dotnetInstaller.installDotnet();
expect(installedVersion).toBe(inputVersion);
});
it(`should supply 'version' argument to the installation script if supplied version is in A.B.C syntax`, async () => {
const inputVersion = '6.0.300';
const inputQuality = '' as QualityOptions;
getExecOutputSpy.mockImplementation(() => {
return Promise.resolve({exitCode: 0, stdout: '', stderr: ''});
});
maxSatisfyingSpy.mockImplementation(() => inputVersion);
const dotnetInstaller = new installer.DotnetCoreInstaller(
inputVersion,
inputQuality
);
await dotnetInstaller.installDotnet();
const scriptArguments = (
getExecOutputSpy.mock.calls[0][1] as string[]
).join(' ');
const expectedArgument = IS_WINDOWS
? `-Version ${inputVersion}`
: `--version ${inputVersion}`;
expect(scriptArguments).toContain(expectedArgument);
});
it(`should warn if the 'quality' input is set and the supplied version is in A.B.C syntax`, async () => {
const inputVersion = '6.0.300';
const inputQuality = 'ga' as QualityOptions;
getExecOutputSpy.mockImplementation(() => {
return Promise.resolve({exitCode: 0, stdout: '', stderr: ''});
});
maxSatisfyingSpy.mockImplementation(() => inputVersion);
const dotnetInstaller = new installer.DotnetCoreInstaller(
inputVersion,
inputQuality
);
await dotnetInstaller.installDotnet();
expect(warningSpy).toHaveBeenCalledWith(
`'dotnet-quality' input can be used only with .NET SDK version in A.B, A.B.x, A and A.x formats where the major tag is higher than 5. You specified: ${inputVersion}. 'dotnet-quality' input is ignored.`
);
});
it(`should warn if the 'quality' input is set and version isn't in A.B.C syntax but major tag is lower then 6`, async () => {
const inputVersion = '3.1';
const inputQuality = 'ga' as QualityOptions;
getExecOutputSpy.mockImplementation(() => {
return Promise.resolve({exitCode: 0, stdout: '', stderr: ''});
});
maxSatisfyingSpy.mockImplementation(() => inputVersion);
const dotnetInstaller = new installer.DotnetCoreInstaller(
inputVersion,
inputQuality
);
await dotnetInstaller.installDotnet();
expect(warningSpy).toHaveBeenCalledWith(
`'dotnet-quality' input can be used only with .NET SDK version in A.B, A.B.x, A and A.x formats where the major tag is higher than 5. You specified: ${inputVersion}. 'dotnet-quality' input is ignored.`
);
});
each(['6', '6.0', '6.0.x', '6.0.*', '6.0.X']).test(
`should supply 'quality' argument to the installation script if quality input is set and version is not in A.B.C syntax`,
async inputVersion => {
const inputQuality = 'ga' as QualityOptions;
const exitCode = 0;
getExecOutputSpy.mockImplementation(() => { getExecOutputSpy.mockImplementation(() => {
return Promise.resolve({exitCode: exitCode, stdout: '', stderr: ''}); return Promise.resolve({
exitCode: 1,
stdout: '',
stderr: errorMessage
});
});
const dotnetInstaller = new installer.DotnetCoreInstaller(
inputVersion,
inputQuality
);
await expect(dotnetInstaller.installDotnet()).rejects.toThrow(
`Failed to install dotnet, exit code: 1. ${errorMessage}`
);
});
it('should return version of .NET SDK after installation complete', async () => {
const inputVersion = '3.1.100';
const inputQuality = '' as QualityOptions;
getExecOutputSpy.mockImplementation(() => {
return Promise.resolve({exitCode: 0, stdout: '', stderr: ''});
});
maxSatisfyingSpy.mockImplementation(() => inputVersion);
const dotnetInstaller = new installer.DotnetCoreInstaller(
inputVersion,
inputQuality
);
const installedVersion = await dotnetInstaller.installDotnet();
expect(installedVersion).toBe(inputVersion);
});
it(`should supply 'version' argument to the installation script if supplied version is in A.B.C syntax`, async () => {
const inputVersion = '6.0.300';
const inputQuality = '' as QualityOptions;
getExecOutputSpy.mockImplementation(() => {
return Promise.resolve({exitCode: 0, stdout: '', stderr: ''});
}); });
maxSatisfyingSpy.mockImplementation(() => inputVersion); maxSatisfyingSpy.mockImplementation(() => inputVersion);
@ -150,44 +86,15 @@ describe('DotnetCoreInstaller tests', () => {
getExecOutputSpy.mock.calls[0][1] as string[] getExecOutputSpy.mock.calls[0][1] as string[]
).join(' '); ).join(' ');
const expectedArgument = IS_WINDOWS const expectedArgument = IS_WINDOWS
? `-Quality ${inputQuality}` ? `-Version ${inputVersion}`
: `--quality ${inputQuality}`; : `--version ${inputVersion}`;
expect(scriptArguments).toContain(expectedArgument); expect(scriptArguments).toContain(expectedArgument);
} });
);
each(['6', '6.0', '6.0.x', '6.0.*', '6.0.X']).test( it(`should warn if the 'quality' input is set and the supplied version is in A.B.C syntax`, async () => {
`should supply 'channel' argument to the installation script if version isn't in A.B.C syntax`, const inputVersion = '6.0.300';
async inputVersion => { const inputQuality = 'ga' as QualityOptions;
const inputQuality = '' as QualityOptions;
const exitCode = 0;
getExecOutputSpy.mockImplementation(() => {
return Promise.resolve({exitCode: exitCode, stdout: '', stderr: ''});
});
maxSatisfyingSpy.mockImplementation(() => inputVersion);
const dotnetInstaller = new installer.DotnetCoreInstaller(
inputVersion,
inputQuality
);
await dotnetInstaller.installDotnet();
const scriptArguments = (
getExecOutputSpy.mock.calls[0][1] as string[]
).join(' ');
const expectedArgument = IS_WINDOWS ? `-Channel 6.0` : `--channel 6.0`;
expect(scriptArguments).toContain(expectedArgument);
}
);
if (IS_WINDOWS) {
it(`should supply '-ProxyAddress' argument to the installation script if env.variable 'https_proxy' is set`, async () => {
process.env['https_proxy'] = 'https://proxy.com';
const inputVersion = '6.0.100';
const inputQuality = '' as QualityOptions;
getExecOutputSpy.mockImplementation(() => { getExecOutputSpy.mockImplementation(() => {
return Promise.resolve({exitCode: 0, stdout: '', stderr: ''}); return Promise.resolve({exitCode: 0, stdout: '', stderr: ''});
@ -201,19 +108,14 @@ describe('DotnetCoreInstaller tests', () => {
await dotnetInstaller.installDotnet(); await dotnetInstaller.installDotnet();
const scriptArguments = ( expect(warningSpy).toHaveBeenCalledWith(
getExecOutputSpy.mock.calls[0][1] as string[] `'dotnet-quality' input can be used only with .NET SDK version in A.B, A.B.x, A and A.x formats where the major tag is higher than 5. You specified: ${inputVersion}. 'dotnet-quality' input is ignored.`
).join(' ');
expect(scriptArguments).toContain(
`-ProxyAddress ${process.env['https_proxy']}`
); );
}); });
it(`should supply '-ProxyBypassList' argument to the installation script if env.variable 'no_proxy' is set`, async () => { it(`should warn if the 'quality' input is set and version isn't in A.B.C syntax but major tag is lower then 6`, async () => {
process.env['no_proxy'] = 'first.url,second.url'; const inputVersion = '3.1';
const inputVersion = '6.0.100'; const inputQuality = 'ga' as QualityOptions;
const inputQuality = '' as QualityOptions;
getExecOutputSpy.mockImplementation(() => { getExecOutputSpy.mockImplementation(() => {
return Promise.resolve({exitCode: 0, stdout: '', stderr: ''}); return Promise.resolve({exitCode: 0, stdout: '', stderr: ''});
@ -227,142 +129,274 @@ describe('DotnetCoreInstaller tests', () => {
await dotnetInstaller.installDotnet(); await dotnetInstaller.installDotnet();
const scriptArguments = ( expect(warningSpy).toHaveBeenCalledWith(
getExecOutputSpy.mock.calls[0][1] as string[] `'dotnet-quality' input can be used only with .NET SDK version in A.B, A.B.x, A and A.x formats where the major tag is higher than 5. You specified: ${inputVersion}. 'dotnet-quality' input is ignored.`
).join(' ');
expect(scriptArguments).toContain(
`-ProxyBypassList ${process.env['no_proxy']}`
); );
}); });
}
});
describe('addToPath() tests', () => {
it(`should export DOTNET_ROOT env.var with value from DOTNET_INSTALL_DIR env.var`, async () => {
process.env['DOTNET_INSTALL_DIR'] = 'fictious/dotnet/install/dir';
installer.DotnetCoreInstaller.addToPath();
const dotnet_root = process.env['DOTNET_ROOT'];
expect(dotnet_root).toBe(process.env['DOTNET_INSTALL_DIR']);
});
it(`should export value from the DOTNET_INSTALL_DIR env.var to the PATH`, async () => { each(['6', '6.0', '6.0.x', '6.0.*', '6.0.X']).test(
process.env['DOTNET_INSTALL_DIR'] = 'fictious/dotnet/install/dir'; `should supply 'quality' argument to the installation script if quality input is set and version (%s) is not in A.B.C syntax`,
installer.DotnetCoreInstaller.addToPath(); async inputVersion => {
const path = process.env['PATH']; const inputQuality = 'ga' as QualityOptions;
expect(path).toContain(process.env['DOTNET_INSTALL_DIR']); const exitCode = 0;
}); getExecOutputSpy.mockImplementation(() => {
}); return Promise.resolve({
}); exitCode: exitCode,
stdout: '',
stderr: ''
});
});
maxSatisfyingSpy.mockImplementation(() => inputVersion);
describe('DotnetVersionResolver tests', () => { const dotnetInstaller = new installer.DotnetCoreInstaller(
each([ inputVersion,
'3.1', inputQuality
'3.x', );
'3.1.x',
'3.1.*', await dotnetInstaller.installDotnet();
'3.1.X',
'3.1.2', const scriptArguments = (
'3.1.0-preview1' getExecOutputSpy.mock.calls[0][1] as string[]
]).test( ).join(' ');
'if valid version is supplied, it should return version object with some value', const expectedArgument = IS_WINDOWS
async version => { ? `-Quality ${inputQuality}`
const dotnetVersionResolver = new installer.DotnetVersionResolver( : `--quality ${inputQuality}`;
version
expect(scriptArguments).toContain(expectedArgument);
}
); );
const versionObject = await dotnetVersionResolver.createDotNetVersion();
expect(!!versionObject.value).toBe(true); each(['6', '6.0', '6.0.x', '6.0.*', '6.0.X']).test(
} `should supply 'channel' argument to the installation script if version (%s) isn't in A.B.C syntax`,
); async inputVersion => {
const inputQuality = '' as QualityOptions;
const exitCode = 0;
getExecOutputSpy.mockImplementation(() => {
return Promise.resolve({
exitCode: exitCode,
stdout: '',
stderr: ''
});
});
maxSatisfyingSpy.mockImplementation(() => inputVersion);
each([ const dotnetInstaller = new installer.DotnetCoreInstaller(
'.', inputVersion,
'..', inputQuality
' . ', );
'. ',
' .',
' . . ',
' .. ',
' . ',
'-1.-1',
'-1',
'-1.-1.-1',
'..3',
'1..3',
'1..',
'.2.3',
'.2.x',
'*.',
'1.2.',
'1.2.-abc',
'a.b',
'a.b.c',
'a.b.c-preview',
' 0 . 1 . 2 ',
'invalid'
]).test('if invalid version is supplied, it should throw', async version => {
const dotnetVersionResolver = new installer.DotnetVersionResolver(version);
await expect( await dotnetInstaller.installDotnet();
async () => await dotnetVersionResolver.createDotNetVersion()
).rejects.toThrow();
});
each(['3', '3.1', '3.1.x', '3.1.*', '3.1.X']).test( const scriptArguments = (
"if version that can be resolved to 'channel' option is supplied, it should set type to 'channel' in version object", getExecOutputSpy.mock.calls[0][1] as string[]
async version => { ).join(' ');
const dotnetVersionResolver = new installer.DotnetVersionResolver( const expectedArgument = IS_WINDOWS
version ? `-Channel 6.0`
: `--channel 6.0`;
expect(scriptArguments).toContain(expectedArgument);
}
); );
const versionObject = await dotnetVersionResolver.createDotNetVersion();
expect(versionObject.type.toLowerCase().includes('channel')).toBe(true);
}
);
each(['6.0', '6.0.x', '6.0.*', '6.0.X']).test(
"if version that can be resolved to 'channel' option is supplied and its major tag is >= 6, it should set type to 'channel' and qualityFlag to 'true' in version object",
async version => {
const dotnetVersionResolver = new installer.DotnetVersionResolver(
version
);
const versionObject = await dotnetVersionResolver.createDotNetVersion();
expect(versionObject.type.toLowerCase().includes('channel')).toBe(true);
expect(versionObject.qualityFlag).toBe(true);
}
);
each(['3.1.2', '3.1.0-preview1']).test(
"if version that can be resolved to 'version' option is supplied, it should set quality flag to 'false' and type to 'version' in version object",
async version => {
const dotnetVersionResolver = new installer.DotnetVersionResolver(
version
);
const versionObject = await dotnetVersionResolver.createDotNetVersion();
expect(versionObject.type.toLowerCase().includes('version')).toBe(true);
expect(versionObject.qualityFlag).toBe(false);
}
);
each(['3.1.2', '3.1']).test(
'it should create proper line arguments for powershell/bash installation scripts',
async version => {
const dotnetVersionResolver = new installer.DotnetVersionResolver(
version
);
const versionObject = await dotnetVersionResolver.createDotNetVersion();
const windowsRegEx = new RegExp(/^-(Version|Channel)/);
const nonWindowsRegEx = new RegExp(/^--(version|channel)/);
if (IS_WINDOWS) { if (IS_WINDOWS) {
expect(windowsRegEx.test(versionObject.type)).toBe(true); it(`should supply '-ProxyAddress' argument to the installation script if env.variable 'https_proxy' is set`, async () => {
expect(nonWindowsRegEx.test(versionObject.type)).toBe(false); process.env['https_proxy'] = 'https://proxy.com';
} else { const inputVersion = '6.0.100';
expect(nonWindowsRegEx.test(versionObject.type)).toBe(true); const inputQuality = '' as QualityOptions;
expect(windowsRegEx.test(versionObject.type)).toBe(false);
getExecOutputSpy.mockImplementation(() => {
return Promise.resolve({exitCode: 0, stdout: '', stderr: ''});
});
maxSatisfyingSpy.mockImplementation(() => inputVersion);
const dotnetInstaller = new installer.DotnetCoreInstaller(
inputVersion,
inputQuality
);
await dotnetInstaller.installDotnet();
const scriptArguments = (
getExecOutputSpy.mock.calls[0][1] as string[]
).join(' ');
expect(scriptArguments).toContain(
`-ProxyAddress ${process.env['https_proxy']}`
);
});
it(`should supply '-ProxyBypassList' argument to the installation script if env.variable 'no_proxy' is set`, async () => {
process.env['no_proxy'] = 'first.url,second.url';
const inputVersion = '6.0.100';
const inputQuality = '' as QualityOptions;
getExecOutputSpy.mockImplementation(() => {
return Promise.resolve({exitCode: 0, stdout: '', stderr: ''});
});
maxSatisfyingSpy.mockImplementation(() => inputVersion);
const dotnetInstaller = new installer.DotnetCoreInstaller(
inputVersion,
inputQuality
);
await dotnetInstaller.installDotnet();
const scriptArguments = (
getExecOutputSpy.mock.calls[0][1] as string[]
).join(' ');
expect(scriptArguments).toContain(
`-ProxyBypassList ${process.env['no_proxy']}`
);
});
} }
} });
); describe('addToPath() tests', () => {
it(`should export DOTNET_ROOT env.var with value from DOTNET_INSTALL_DIR env.var`, async () => {
process.env['DOTNET_INSTALL_DIR'] = 'fictious/dotnet/install/dir';
installer.DotnetCoreInstaller.addToPath();
const dotnet_root = process.env['DOTNET_ROOT'];
expect(dotnet_root).toBe(process.env['DOTNET_INSTALL_DIR']);
});
it(`should export value from the DOTNET_INSTALL_DIR env.var to the PATH`, async () => {
process.env['DOTNET_INSTALL_DIR'] = 'fictious/dotnet/install/dir';
installer.DotnetCoreInstaller.addToPath();
const path = process.env['PATH'];
expect(path).toContain(process.env['DOTNET_INSTALL_DIR']);
});
});
});
describe('DotnetVersionResolver tests', () => {
describe('createDotNetVersion() tests', () => {
each([
'3.1',
'3.x',
'3.1.x',
'3.1.*',
'3.1.X',
'3.1.2',
'3.1.0-preview1'
]).test(
'if valid version is supplied (%s), it should return version object with some value',
async version => {
const dotnetVersionResolver = new installer.DotnetVersionResolver(
version
);
const versionObject =
await dotnetVersionResolver.createDotNetVersion();
expect(!!versionObject.value).toBe(true);
}
);
each([
'.',
'..',
' . ',
'. ',
' .',
' . . ',
' .. ',
' . ',
'-1.-1',
'-1',
'-1.-1.-1',
'..3',
'1..3',
'1..',
'.2.3',
'.2.x',
'*.',
'1.2.',
'1.2.-abc',
'a.b',
'a.b.c',
'a.b.c-preview',
' 0 . 1 . 2 ',
'invalid'
]).test(
'if invalid version is supplied (%s), it should throw',
async version => {
const dotnetVersionResolver = new installer.DotnetVersionResolver(
version
);
await expect(
async () => await dotnetVersionResolver.createDotNetVersion()
).rejects.toThrow();
}
);
each(['3', '3.1', '3.1.x', '3.1.*', '3.1.X']).test(
"if version that can be resolved to 'channel' option is supplied (%s), it should set type to 'channel' in version object",
async version => {
const dotnetVersionResolver = new installer.DotnetVersionResolver(
version
);
const versionObject =
await dotnetVersionResolver.createDotNetVersion();
expect(versionObject.type.toLowerCase().includes('channel')).toBe(
true
);
}
);
each(['6.0', '6.0.x', '6.0.*', '6.0.X']).test(
"if version that can be resolved to 'channel' option is supplied and its major tag is >= 6 (%s), it should set type to 'channel' and qualityFlag to 'true' in version object",
async version => {
const dotnetVersionResolver = new installer.DotnetVersionResolver(
version
);
const versionObject =
await dotnetVersionResolver.createDotNetVersion();
expect(versionObject.type.toLowerCase().includes('channel')).toBe(
true
);
expect(versionObject.qualityFlag).toBe(true);
}
);
each(['3.1.2', '3.1.0-preview1']).test(
"if version that can be resolved to 'version' option is supplied (%s), it should set quality flag to 'false' and type to 'version' in version object",
async version => {
const dotnetVersionResolver = new installer.DotnetVersionResolver(
version
);
const versionObject =
await dotnetVersionResolver.createDotNetVersion();
expect(versionObject.type.toLowerCase().includes('version')).toBe(
true
);
expect(versionObject.qualityFlag).toBe(false);
}
);
each(['3.1.2', '3.1']).test(
'it should create proper line arguments for powershell/bash installation scripts',
async version => {
const dotnetVersionResolver = new installer.DotnetVersionResolver(
version
);
const versionObject =
await dotnetVersionResolver.createDotNetVersion();
const windowsRegEx = new RegExp(/^-(Version|Channel)/);
const nonWindowsRegEx = new RegExp(/^--(version|channel)/);
if (IS_WINDOWS) {
expect(windowsRegEx.test(versionObject.type)).toBe(true);
expect(nonWindowsRegEx.test(versionObject.type)).toBe(false);
} else {
expect(nonWindowsRegEx.test(versionObject.type)).toBe(true);
expect(windowsRegEx.test(versionObject.type)).toBe(false);
}
}
);
});
});
}); });