Skip to content

Commit

Permalink
fix(amplify-category-notifications): add apns sandbox channel (#3669)
Browse files Browse the repository at this point in the history
APNS Sandbox channel will be enabled/disabled when regular APNS channel is enabled/disabled

fix #3247

Co-authored-by: Zhou <zhoweimi@186590ce137f.ant.amazon.com>
  • Loading branch information
UnleashedMind and Zhou committed Mar 20, 2020
1 parent e20ed97 commit 841297f
Show file tree
Hide file tree
Showing 2 changed files with 119 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,56 @@ const channelAPNS = require('../../lib/channel-APNS');
describe('channel-APNS', () => {
const mockServiceOutput = {};
const mockChannelOutput = { Enabled: true };
mockServiceOutput[channelName] = mockChannelOutput;

const mockPinpointResponseErr = {};
const mockPinpointResponseData = {
APNSChannelResponse: {},
};
const mockKeyConfig = {};
const mockCertificateConfig = {};

const mockPinpointClient = {
updateApnsChannel: jest.fn((_, callback) => {
callback(null, mockPinpointResponseData);
updateApnsChannel: jest.fn(() => {
return {
promise: () => {
return new Promise((resolve, reject) => {
resolve(mockPinpointResponseData);
});
},
};
}),
updateApnsSandboxChannel: jest.fn(() => {
return {
promise: () => {
return new Promise((resolve, reject) => {
resolve(mockPinpointResponseData);
});
},
};
}),
};

const mockPinpointClientReject = {
updateApnsChannel: jest.fn(() => {
return {
promise: () => {
return new Promise((resolve, reject) => {
reject(mockPinpointResponseErr);
});
},
};
}),
updateApnsSandboxChannel: jest.fn(() => {
return {
promise: () => {
return new Promise((resolve, reject) => {
reject(mockPinpointResponseErr);
});
},
};
}),
};
mockServiceOutput[channelName] = mockChannelOutput;

let mockContext = {
exeInfo: {
Expand All @@ -36,6 +74,19 @@ describe('channel-APNS', () => {
},
};

let mockContextReject = {
exeInfo: {
serviceMeta: {
output: mockServiceOutput,
},
pinpointClient: mockPinpointClientReject,
},
print: {
info: jest.fn(),
error: jest.fn(),
},
};

beforeAll(() => {
global.console = { log: jest.fn() };
configureKey.run = jest.fn(() => {
Expand All @@ -49,10 +100,6 @@ describe('channel-APNS', () => {
beforeEach(() => {});

test('configure', () => {
mockPinpointClient.updateApnsChannel = jest.fn((_, callback) => {
callback(null, mockPinpointResponseData);
});

mockChannelOutput.Enabled = true;
mockirer(inquirer, { disableChannel: true });
channelAPNS.configure(mockContext).then(() => {
Expand All @@ -73,50 +120,47 @@ describe('channel-APNS', () => {
});

test('enable', async () => {
mockPinpointClient.updateApnsChannel = jest.fn((_, callback) => {
callback(null, mockPinpointResponseData);
});

mockirer(inquirer, { DefaultAuthenticationMethod: 'Certificate' });
channelAPNS.enable(mockContext, 'successMessage').then(() => {
channelAPNS.enable(mockContext, 'successMessage').then(data => {
expect(mockPinpointClient.updateApnsChannel).toBeCalled();
expect(mockPinpointClient.updateApnsSandboxChannel).toBeCalled();
expect(data).toEqual(mockPinpointResponseData);
});

mockirer(inquirer, { DefaultAuthenticationMethod: 'Key' });
channelAPNS.enable(mockContext, 'successMessage').then(() => {
channelAPNS.enable(mockContext, 'successMessage').then(data => {
expect(mockPinpointClient.updateApnsChannel).toBeCalled();
expect(mockPinpointClient.updateApnsSandboxChannel).toBeCalled();
expect(data).toEqual(mockPinpointResponseData);
});
});

test('enable unsccessful', async () => {
mockPinpointClient.updateApnsChannel = jest.fn((_, callback) => {
callback(mockPinpointResponseErr, mockPinpointResponseData);
});

mockirer(inquirer, { DefaultAuthenticationMethod: 'Certificate' });
channelAPNS.enable(mockContext, 'successMessage').catch(err => {
channelAPNS.enable(mockContextReject, 'successMessage').catch(err => {
expect(mockPinpointClient.updateApnsChannel).toBeCalled();
expect(err).toEqual(mockPinpointResponseErr);
});

mockirer(inquirer, { DefaultAuthenticationMethod: 'Key' });
channelAPNS.enable(mockContext, 'successMessage').catch(err => {
channelAPNS.enable(mockContextReject, 'successMessage').catch(err => {
expect(mockPinpointClient.updateApnsChannel).toBeCalled();
expect(err).toEqual(mockPinpointResponseErr);
});
});

test('disable', () => {
mockPinpointClient.updateApnsChannel = jest.fn((_, callback) => {
callback(null, mockPinpointResponseData);
});
channelAPNS.disable(mockContext).then(() => {
channelAPNS.disable(mockContext).then(data => {
expect(mockPinpointClient.updateApnsChannel).toBeCalled();
expect(mockPinpointClient.updateApnsSandboxChannel).toBeCalled();
expect(data).toEqual(mockPinpointResponseData);
});
});

mockPinpointClient.updateApnsChannel = jest.fn((_, callback) => {
callback(mockPinpointResponseErr, mockPinpointResponseData);
});
channelAPNS.disable(mockContext).catch(() => {
test('disable unsuccessful', () => {
channelAPNS.disable(mockContextReject).catch(err => {
expect(mockPinpointClient.updateApnsChannel).toBeCalled();
expect(err).toEqual(mockPinpointResponseErr);
});
});
});
77 changes: 48 additions & 29 deletions packages/amplify-category-notifications/lib/channel-APNS.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ async function enable(context, successMessage) {
process.exit(1);
}

spinner.start('Updating APNS Channel.');

const params = {
ApplicationId: context.exeInfo.serviceMeta.output.Id,
APNSChannelRequest: {
Expand All @@ -82,22 +84,30 @@ async function enable(context, successMessage) {
},
};

spinner.start('Updating APNS Channel.');
return new Promise((resolve, reject) => {
context.exeInfo.pinpointClient.updateApnsChannel(params, (err, data) => {
if (err) {
spinner.fail('update channel error');
reject(err);
} else {
if (!successMessage) {
successMessage = `The ${channelName} channel has been successfully enabled.`;
}
spinner.succeed(successMessage);
context.exeInfo.serviceMeta.output[channelName] = data.APNSChannelResponse;
resolve(data);
}
});
});
const sandboxParams = {
ApplicationId: context.exeInfo.serviceMeta.output.Id,
APNSSandboxChannelRequest: {
...answers,
Enabled: true,
},
};

let data;
try {
data = await context.exeInfo.pinpointClient.updateApnsChannel(params).promise();
await context.exeInfo.pinpointClient.updateApnsSandboxChannel(sandboxParams).promise();
context.exeInfo.serviceMeta.output[channelName] = data.APNSChannelResponse;
} catch (e) {
spinner.fail(`Failed to update the ${channelName} channel.`);
throw e;
}

if (!successMessage) {
successMessage = `The ${channelName} channel has been successfully enabled.`;
}
spinner.succeed(successMessage);

return data;
}

function validateInputParams(channelInput) {
Expand Down Expand Up @@ -127,26 +137,35 @@ function validateInputParams(channelInput) {
return channelInput;
}

function disable(context) {
async function disable(context) {
const params = {
ApplicationId: context.exeInfo.serviceMeta.output.Id,
APNSChannelRequest: {
Enabled: false,
},
};

const sandboxParams = {
ApplicationId: context.exeInfo.serviceMeta.output.Id,
APNSSandboxChannelRequest: {
Enabled: false,
},
};

spinner.start('Updating APNS Channel.');
return new Promise((resolve, reject) => {
context.exeInfo.pinpointClient.updateApnsChannel(params, (err, data) => {
if (err) {
spinner.fail('update channel error');
reject(err);
} else {
spinner.succeed(`The ${channelName} channel has been disabled.`);
context.exeInfo.serviceMeta.output[channelName] = data.APNSChannelResponse;
resolve(data);
}
});
});

let data;
try {
data = await context.exeInfo.pinpointClient.updateApnsChannel(params).promise();
await context.exeInfo.pinpointClient.updateApnsSandboxChannel(sandboxParams).promise();
} catch (e) {
spinner.fail(`Failed to update the ${channelName} channel.`);
throw e;
}

spinner.succeed(`The ${channelName} channel has been disabled.`);
context.exeInfo.serviceMeta.output[channelName] = data.APNSChannelResponse;
return data;
}

function pull(context, pinpointApp) {
Expand Down

0 comments on commit 841297f

Please sign in to comment.