Skip to content

Commit

Permalink
no implicit; update packages
Browse files Browse the repository at this point in the history
  • Loading branch information
nkrusch committed Aug 21, 2021
1 parent 5914112 commit 8f9eb99
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 46 deletions.
47 changes: 21 additions & 26 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,13 @@
},
"devDependencies": {
"@types/mocha": "^9.0.0",
"@types/node": "^16.4.13",
"@types/node": "^16.7.1",
"chai": "^4.3.4",
"coveralls": "^3.1.1",
"mocha": "^9.0.3",
"mocha": "^9.1.0",
"nyc": "^15.1.0",
"sinon": "^11.1.2",
"ts-node": "^10.2.0",
"ts-node": "^10.2.1",
"typescript": "^4.3.5"
}
}
16 changes: 9 additions & 7 deletions src/cws.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
*/

const fs = require('fs');
const OAuth2 = require('googleapis').google.auth.OAuth2;
import {Credentials, APIResult, UploadResult, PublishResult} from './types'

// @ts-ignore
import * as request from 'superagent';
import {APIResult, UploadResult, PublishResult} from './types'
import {google} from 'googleapis';
import dictionary from './dictionary';

/**
Expand Down Expand Up @@ -55,10 +56,11 @@ const getFileBlob = (filepath: string) => {
*/
const getAccessToken = (refresh_token: string, client_id: string, client_secret: string) =>
new Promise((resolve) => {
const oauth2Client = new OAuth2(client_id, client_secret, 'urn:ietf:wg:oauth:2.0:oob');
const oauth2Client = new google.auth.OAuth2(client_id, client_secret, 'urn:ietf:wg:oauth:2.0:oob');
oauth2Client.setCredentials({access_token: null, refresh_token});
oauth2Client.refreshAccessToken((err, tokens) =>
resolve((err || !tokens || !tokens.access_token) ? undefined : tokens.access_token));
oauth2Client.refreshAccessToken((
err: object | null, credentials: Credentials | null
) => resolve(!err && credentials ? credentials.access_token : undefined));
});

/**
Expand All @@ -74,7 +76,7 @@ const uploadFile = (extension_id: string, blob: Blob, access_token: string) =>
.query({uploadType: 'media'})
.set({Authorization: 'Bearer ' + access_token})
.send(blob)
.end((e, r) => resolve([e, r])));
.end((e: boolean, r: UploadResult) => resolve([e, r])));

/**
* @description Publish extension
Expand All @@ -90,7 +92,7 @@ const publishExtension = (extension_id: string, access_token: string, beta: bool
.post(`https://www.googleapis.com/chromewebstore/v1.1/items/${extension_id}/publish`)
.query({publishTarget: beta ? 'trustedTesters' : 'default'})
.set({Authorization: 'Bearer ' + access_token})
.end((e, r) => resolve([e, r])));
.end((e: boolean, r: UploadResult) => resolve([e, r])));

/**
* @description Display result of some workflow task
Expand Down
3 changes: 3 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/** 3rd party library types **/
export {Credentials} from "google-auth-library/build/src/auth/credentials";

/**
* Represents some Chrome WebStore API response.
*/
Expand Down
24 changes: 22 additions & 2 deletions test/cws.spec.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
const fs = require('fs');
import {ApiServer, ApiResponses} from './mocks.spec';
const OAuth2 = require('googleapis').google.auth.OAuth2;
import * as request from 'superagent';
// @ts-ignore
import * as sinon from 'sinon';
// @ts-ignore
import {expect} from 'chai';
import {ApiServer, ApiResponses} from './mocks.spec';
// @ts-ignore
import * as request from 'superagent';
// @ts-ignore
import {upload, publish} from "../dist/cws";

const apiClient = 'myClientId',
Expand All @@ -20,7 +24,9 @@ describe('Chrome Web Store (CWS) Publish', function () {
beforeEach(async function () {

// stub web store api server upload request
// @ts-ignore
global.uploadReq = sinon.stub(request, 'put');
// @ts-ignore
global.publishReq = sinon.stub(request, 'post');

// stub console log, file system
Expand All @@ -37,7 +43,9 @@ describe('Chrome Web Store (CWS) Publish', function () {

afterEach(async function () {
sinon.restore();
// @ts-ignore
global.uploadReq.restore();
// @ts-ignore
global.publishReq.restore();
});

Expand Down Expand Up @@ -83,8 +91,10 @@ describe('Chrome Web Store (CWS) Publish', function () {
});

it('Failed upload request terminates process with failure', async function () {
// @ts-ignore
global.uploadReq.returns(ApiServer(ApiResponses.upload.failure));
const token = await upload(apiClient, apiSecret, apiToken, goodZip, extensionId);
// @ts-ignore
expect(global.uploadReq.calledOnce, 'calls upload').to.equal(true);
expect((console.log as any).notCalled, 'does not display success').to.equal(true);
expect((console.error as any).calledOnce, 'displays failure').to.equal(true);
Expand All @@ -93,11 +103,15 @@ describe('Chrome Web Store (CWS) Publish', function () {
});

it('Successful upload followed by failing publish fails', async function () {
// @ts-ignore
global.uploadReq.returns(ApiServer(ApiResponses.upload.success));
// @ts-ignore
global.publishReq.returns(ApiServer(ApiResponses.publish.taken_down));
await publish(apiClient, apiSecret, apiToken, goodZip, extensionId, false);
// @ts-ignore
expect(global.uploadReq.calledOnce, 'calls upload').to.equal(true);
expect((console.log as any).calledOnce, 'second request fails').to.equal(true);
// @ts-ignore
expect(global.publishReq.calledOnce, 'proceeds to calls publish').to.equal(true);
expect((console.error as any).calledOnce, 'second request fails').to.equal(true);
expect((process.exit as any).calledWith(1)).to.be.true;
Expand All @@ -107,7 +121,9 @@ describe('Chrome Web Store (CWS) Publish', function () {
describe('\n\tSuccessful Requests', function () {

beforeEach(async function () {
// @ts-ignore
global.uploadReq.returns(ApiServer(ApiResponses.upload.success));
// @ts-ignore
global.publishReq.returns(ApiServer(ApiResponses.publish.ok));
sinon.stub(OAuth2.prototype, 'refreshAccessToken').yields(false, {access_token});
});
Expand All @@ -117,6 +133,7 @@ describe('Chrome Web Store (CWS) Publish', function () {
});

it('"In progress" counts as success', async function () {
// @ts-ignore
global.uploadReq.returns(ApiServer(ApiResponses.upload.progress));
const token = await upload(apiClient, apiSecret, apiToken, goodZip, extensionId);
expect(fs.readFileSync.calledOnce, 'file read succeeds').to.equal(true);
Expand All @@ -140,9 +157,11 @@ describe('Chrome Web Store (CWS) Publish', function () {
});

it('Publish that requires review', async function () {
// @ts-ignore
global.publishReq.returns(ApiServer(ApiResponses.publish.review));
await publish(apiClient, apiSecret, apiToken, goodZip, extensionId, false);
expect(fs.readFileSync.calledOnce, 'file read succeeds').to.equal(true);
// @ts-ignore
expect(global.publishReq().q.publishTarget, 'publishes to default').to.equal('default');
expect((console.log as any).calledTwice, 'outputs 2 good responses to console').to.equal(true);
expect((process.exit as any).notCalled).to.be.true;
Expand All @@ -151,6 +170,7 @@ describe('Chrome Web Store (CWS) Publish', function () {
it('Publish to testers', async function () {
await publish(apiClient, apiSecret, apiToken, goodZip, extensionId, true);
expect(fs.readFileSync.calledOnce, 'file read succeeds').to.equal(true);
// @ts-ignore
expect(global.publishReq().q.publishTarget, 'publishes to testers').to.equal('trustedTesters');
expect((console.log as any).calledTwice, 'outputs 2 good responses to console').to.equal(true);
expect((process.exit as any).notCalled).to.be.true;
Expand Down
10 changes: 5 additions & 5 deletions test/mocks.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {APIResult, PublishResult, UploadResult} from "../src/types";

interface NetworkRequest {
q: string,
interface SuperAgentRequest {
q: object,
end: Function,
query: Function,
send: Function,
Expand All @@ -10,12 +10,12 @@ interface NetworkRequest {

// Mock superagent and web store server
export const ApiServer = (result: APIResult) => {
const superAgent: NetworkRequest = {
const superAgent: SuperAgentRequest = {
q: undefined,
send: () => superAgent,
set: () => superAgent,
end: cb => cb(false, result),
query: q => {
end: (cb: Function) => cb(false, result),
query: (q: object) => {
superAgent.q = q;
return superAgent;
},
Expand Down
9 changes: 7 additions & 2 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
{
"compilerOptions": {
"allowJs": false,
"noImplicitAny": true,
"outDir": "./dist",
"target": "es5"
"target": "es5",
"moduleResolution": "node",
"removeComments": true
},
"include": ["./src/**/*"]
"include": [
"./src/**/*"
]
}
4 changes: 3 additions & 1 deletion tsconfig.testing.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
{
"compilerOptions": {
"allowJs": false,
"target": "es5"
"target": "es5",
"noImplicitAny": false,
"moduleResolution": "node"
},
"include": ["./test/**/*"]
}

0 comments on commit 8f9eb99

Please sign in to comment.