import axios from "axios";
import process from "process";
import {expect} from "chai";
import {
getCertificateBasePath,
getCustomMavenSettingCertificate,
getDockerAcrEnterpriseCertificate,
getDockerAcrPersonalCertificate,
getDockerCustomPersonalCertificate,
getMavenPrivateRepoCertificate,
getNewCustomMavenSettingCertificate,
getNewMavenPrivateRepoCertificate,
getNpmPrivateRepoCertificate,
getOssRamStsCertificate,
getOssRamServiceConnectionCertificate,
getRamStsCertificate,
getCodeupCertificate,
OssBucketType,
getKubernetesCertificate, getJenkinsCertificate, getNugetPrivateRepoCertificate,
getCertificate
} from '../../src/certificate/certificate'
import * as sinon from 'sinon';
describe('getCertificateBasePath', () => {
it('should throw an error if FLOW_OPENAPI_URL is empty', () => {
delete process.env['FLOW_OPENAPI_URL'];
expect(getCertificateBasePath).to.throw('missing \'FLOW_OPENAPI_URL\' env variables');
});
it('should return the correct certificate base path', () => {
process.env['FLOW_OPENAPI_URL'] = 'https://flow.aliyun.com';
const expectedPath = 'https://flow.aliyun.com/openapi/certificates';
expect(getCertificateBasePath()).to.equal(expectedPath);
});
});
let axiosRequestStub: sinon.SinonStub;
describe('getCertificate', () => {
beforeEach(() => {
process.env.FLOW_OPENAPI_URL = 'https://flow-test.aliyun.com'
})
it('getMavenPrivateRepoCertificate should return certificate record', async () => {
const repoSettings = "xxxx>";
const response = {
data: [{
"key": "REPO_SETTINGS",
"value": repoSettings
}],
};
axiosRequestStub = sinon.stub(axios, 'request').resolves(response);
const flowJobToken = "3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D";
const result = await getMavenPrivateRepoCertificate(flowJobToken)
expect(result["REPO_SETTINGS"]).to.equal(repoSettings)
const params = {
"flowJobToken": flowJobToken
}
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: "https://flow-test.aliyun.com/openapi/certificates/mavenPrivateRepo",
params: params
})
})
it('getCustomMavenSettingCertificate should return certificate record', async () => {
const repoSettings = "xxxx>";
const response = {
data: [{
"key": "CUSTOM_MAVEN_SETTING_XML",
"value": repoSettings
}],
};
axiosRequestStub = sinon.stub(axios, 'request').resolves(response);
const flowJobToken = "3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D";
const result = await getCustomMavenSettingCertificate(flowJobToken)
expect(result["CUSTOM_MAVEN_SETTING_XML"]).to.equal(repoSettings)
const params = {
"flowJobToken": flowJobToken
}
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: "https://flow-test.aliyun.com/openapi/certificates/mavenCustomSetting",
params: params
})
})
it('getNewMavenPrivateRepoCertificate should return certificate content', async () => {
const repoSettings = "xxxx>";
const response = {
data: {
"mavenSettingsContent": repoSettings
}
};
axiosRequestStub = sinon.stub(axios, 'request').resolves(response);
const flowJobToken = "3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D";
const result = await getNewMavenPrivateRepoCertificate(flowJobToken)
expect(result.mavenSettingsContent).to.equal(repoSettings)
const params = {
"flowJobToken": flowJobToken
}
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: "https://flow-test.aliyun.com/openapi/certificates/newMavenPrivateRepo",
params: params
})
})
it('getNewCustomMavenSettingCertificate should return certificate content', async () => {
const repoSettings = "xxxx>";
const response = {
data: {
"mavenSettingsContent": repoSettings
}
};
axiosRequestStub = sinon.stub(axios, 'request').resolves(response);
const flowJobToken = "3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D";
const result = await getNewCustomMavenSettingCertificate(flowJobToken)
expect(result.mavenSettingsContent).to.equal(repoSettings)
const params = {
"flowJobToken": flowJobToken
}
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: "https://flow-test.aliyun.com/openapi/certificates/newMavenCustomSetting",
params: params
})
})
it('getNpmPrivateRepoCertificate should return certificate record', async () => {
const repoConfigContent = "registry:http://xxx/npm/";
const response = {
data: {
"npmRepoConfigContent": repoConfigContent
}
};
axiosRequestStub = sinon.stub(axios, 'request').resolves(response);
const flowJobToken = "3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D";
const result = await getNpmPrivateRepoCertificate(flowJobToken)
expect(result.npmRepoConfigContent).to.equal(repoConfigContent)
const params = {
"flowJobToken": flowJobToken
}
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: "https://flow-test.aliyun.com/openapi/certificates/npmPrivateRepo",
params: params
})
})
it('getDockerAcrEnterpriseCertificate should return certificate record', async () => {
const response = {
data: {
"username": "root",
"password": "123456"
}
};
axiosRequestStub = sinon.stub(axios, 'request').resolves(response);
const flowJobToken = "3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D";
const result = await getDockerAcrEnterpriseCertificate(flowJobToken, "1234", "cn-beijing", "aaaa")
expect(result.password).to.equal("123456")
const params = {
"flowJobToken": flowJobToken,
serviceConnectionId: "1234",
aliyunRegion: "cn-beijing",
instanceName: "aaaa"
}
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: "https://flow-test.aliyun.com/openapi/certificates/dockerAcrEnterprise",
params: params
})
})
it('getDockerAcrPersonalCertificate should return certificate record', async () => {
const response = {
data: {
"username": "root",
"password": "123456"
}
};
axiosRequestStub = sinon.stub(axios, 'request').resolves(response);
const flowJobToken = "3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D";
const result = await getDockerAcrPersonalCertificate(flowJobToken, "1234", "cn-beijing")
expect(result.password).to.equal("123456")
const params = {
"flowJobToken": flowJobToken,
serviceConnectionId: "1234",
aliyunRegion: "cn-beijing"
}
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: "https://flow-test.aliyun.com/openapi/certificates/dockerAcrPersonal",
params: params
})
})
it('getDockerCustomPersonalCertificate should return certificate record', async () => {
const response = {
data: {
"username": "root",
"password": "123456"
}
};
axiosRequestStub = sinon.stub(axios, 'request').resolves(response);
const flowJobToken = "3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D";
const result = await getDockerCustomPersonalCertificate(flowJobToken, "1234")
expect(result.password).to.equal("123456")
const params = {
"flowJobToken": flowJobToken,
serviceConnectionId: "1234"
}
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: "https://flow-test.aliyun.com/openapi/certificates/dockerCustomPersonal",
params: params
})
})
it('getRamStsCertificateCertificate should return certificate record', async () => {
const response = {
data: {
"accessKeyId": "ACCESS_KEY_ID",
"accessKeySecret": "ACCESS_KEY_SECRET",
"securityToken": "SECURITY_TOKEN",
"accountId": "ACCOUNT_ID"
}
};
axiosRequestStub = sinon.stub(axios, 'request').resolves(response);
const flowJobToken = "3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D";
const result = await getRamStsCertificate(flowJobToken, "1234")
expect(result.accessKeySecret).to.equal("ACCESS_KEY_SECRET")
const params = {
"flowJobToken": flowJobToken,
serviceConnectionId: "1234"
}
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: "https://flow-test.aliyun.com/openapi/certificates/ramSts",
params: params
})
})
it('getOSSRamStsCertificateCertificate should return certificate record', async () => {
const response = {
data: {
"accessKeyId": "ACCESS_KEY_ID",
"accessKeySecret": "ACCESS_KEY_SECRET",
"securityToken": "SECURITY_TOKEN",
"bucketName": "bucketName",
"ossPathPrefix": "ossPathPrefix"
}
};
axiosRequestStub = sinon.stub(axios, 'request').resolves(response);
const flowJobToken = "3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D";
const result = await getOssRamStsCertificate(flowJobToken, OssBucketType.ARTIFACT)
expect(result.bucketName).to.equal("bucketName")
const params = {
"flowJobToken": flowJobToken, ossBucketType: OssBucketType.ARTIFACT
}
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: "https://flow-test.aliyun.com/openapi/certificates/ossRamSts",
params: params
})
})
it('getOSSServiceConnectionCertificate should return certificate record', async () => {
const response = {
data: {
"accessKeyId": "ACCESS_KEY_ID",
"accessKeySecret": "ACCESS_KEY_SECRET",
"securityToken": "SECURITY_TOKEN",
}
};
axiosRequestStub = sinon.stub(axios, 'request').resolves(response);
const flowJobToken = "3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D";
const result = await getOssRamServiceConnectionCertificate(flowJobToken, "1234")
expect(result.securityToken).to.equal("SECURITY_TOKEN")
const params = {
"flowJobToken": flowJobToken,
serviceConnectionId: "1234"
}
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: "https://flow-test.aliyun.com/openapi/certificates/ossRamSc",
params: params
})
})
it('getCodeupCertificate should return certificate record', async () => {
const response = {
data: {
"host": "codeup.aliyun.com",
"username": "root",
"password": "123456"
}
};
axiosRequestStub = sinon.stub(axios, 'request').resolves(response);
const flowJobToken = "3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D";
const result = await getCodeupCertificate(flowJobToken, "1234")
expect(result.password).to.equal("123456")
const params = {
"flowJobToken": flowJobToken,
serviceConnectionId: "1234"
}
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: "https://flow-test.aliyun.com/openapi/certificates/codeup",
params: params
})
})
it('should return ack KubernetesCertificate record', async () => {
const response = {
data: {
"type": "ack",
"kubeConfig": "",
"miranaProxy": "http://proxy.example.com",
"jwtToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}
};
axiosRequestStub = sinon.stub(axios, 'request').resolves(response);
axiosRequestStub.resolves(response);
const flowJobToken = "3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D";
const serviceConnectionId = "1234";
const result = await getKubernetesCertificate(flowJobToken, serviceConnectionId);
expect(result.jwtToken).to.equal(response.data.jwtToken);
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: "https://flow-test.aliyun.com/openapi/certificates/kubernetes",
params: {
flowJobToken,
serviceConnectionId
}
});
});
it('getJenkinsCertificate should return certificate record', async () => {
const response = {
data: {
jenkinsMaster: 'http://localhost:8080',
jenkinsUsername: 'root',
jenkinsPassword: '123456'
}
}
axiosRequestStub = sinon.stub(axios, 'request').resolves(response)
const flowJobToken =
'3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D'
const result = await getJenkinsCertificate(flowJobToken, '1234')
expect(result.jenkinsMaster).to.equal('http://localhost:8080')
expect(result.jenkinsUsername).to.equal('root')
expect(result.jenkinsPassword).to.equal('123456')
const params = {
flowJobToken: flowJobToken,
serviceConnectionId: '1234'
}
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: 'https://flow-test.aliyun.com/openapi/certificates/jenkins',
params: params
})
})
it('getNugetPrivateRepoCertificate should return certificate record', async () => {
const mockedNugetRepoConfigContent = "xxxx>";
const repoIds = 'repo1,repo2'
const response = {
data: {
"nugetRepoConfigContent": mockedNugetRepoConfigContent
}
};
axiosRequestStub = sinon.stub(axios, 'request').resolves(response);
const flowJobToken = "3jNKknxWk%2FpG96F0EoaaessTgvTY9DzQFOpmqQgUs37f%2F9jmewaFLIr%2FrxhZ3qaZPEtd7DCWKh4vU98X4QV2ug%3D%3D";
const serviceConnectionId = "1234";
const result = await getNugetPrivateRepoCertificate(flowJobToken, serviceConnectionId, repoIds)
expect(result.nugetRepoConfigContent).to.equal(mockedNugetRepoConfigContent)
const params = {
"flowJobToken": flowJobToken,
"serviceConnectionId": serviceConnectionId,
"repoIds": repoIds
}
sinon.assert.calledOnceWithExactly(axiosRequestStub, {
method: 'GET',
url: "https://flow-test.aliyun.com/openapi/certificates/nugetPrivateRepo",
params: params
})
})
afterEach(() => {
process.env.FLOW_OPENAPI_URL = ''
sinon.restore();
})
})
describe('getCertificate', () => {
let axiosRequestStub: sinon.SinonStub;
beforeEach(() => {
axiosRequestStub = sinon.stub(axios, 'request');
});
afterEach(() => {
axiosRequestStub.restore();
});
it('should return data on successful request', async () => {
const mockData = { key: 'value' };
axiosRequestStub.resolves({ data: mockData });
const result = await getCertificate<{ key: string }>('http://example.com', { param: 'value' });
expect(result).to.deep.equal(mockData);
});
it('should retry on failure and succeed on subsequent attempt', async () => {
const mockData = { key: 'value' };
axiosRequestStub.onCall(0).rejects(new Error('Network Error'));
axiosRequestStub.onCall(1).resolves({ data: mockData });
const result = await getCertificate<{ key: string }>('http://example.com', { param: 'value' });
expect(result).to.deep.equal(mockData);
expect(axiosRequestStub.callCount).to.equal(2);
});
it('should throw an error after reaching max retries', async () => {
axiosRequestStub.rejects(new Error('Network Error'));
try {
await getCertificate<{ key: string }>('http://example.com', { param: 'value' });
expect.fail('Expected to throw an error');
} catch (error) {
// @ts-ignore
expect(error.message).to.include('Get http://example.com failed, abort request.');
}
expect(axiosRequestStub.callCount).to.equal(3);
});
});