UNPKG

6.73 kBJavaScriptView Raw
1const SnsSubscription = require('../functions/sns-subscription');
2const test = require('tape');
3const AWS = require('@mapbox/mock-aws-sdk-js');
4const http = require('http');
5
6test('[sns-subscription] create handles errors', assert => {
7 AWS.stub('SNS', 'subscribe', (opts, cb) => {
8 assert.deepEquals(opts, {
9 Protocol: 'email',
10 TopicArn: 'arn:aws:sns:us-east-1:special-topic',
11 Endpoint: 'someone@mapbox.com'
12 });
13 return cb(new Error('random error'));
14 });
15
16 const subscription = new SnsSubscription('arn:aws:sns:us-east-1:special-topic', 'email', 'someone@mapbox.com');
17
18 subscription.create((err) => {
19 assert.equals(err.message, 'random error', 'errors');
20 AWS.SNS.restore();
21 assert.end();
22 });
23});
24
25test('[sns-subscription] create handles success', assert => {
26 const subscribe = AWS.stub('SNS', 'subscribe', (opts, cb) => {
27 assert.deepEquals(opts, {
28 Protocol: 'email',
29 TopicArn: 'arn:aws:sns:us-east-1:special-topic',
30 Endpoint: 'someone@mapbox.com'
31 });
32 return cb();
33 });
34
35 const subscription = new SnsSubscription('arn:aws:sns:us-east-1:special-topic', 'email', 'someone@mapbox.com');
36
37 subscription.create((err) => {
38 assert.ifError(err, 'should not error');
39 assert.equals(subscribe.callCount, 1, 'subscribe called once');
40 AWS.SNS.restore();
41 assert.end();
42 });
43});
44
45test('[sns-subscription] update unsubscribes old endpoint and subscribes the new one', assert => {
46 const subscribe = AWS.stub('SNS', 'subscribe', (opts, cb) => {
47 assert.deepEquals(opts, {
48 Protocol: 'email',
49 TopicArn: 'arn:aws:sns:us-east-1:special-topic',
50 Endpoint: 'someone-new@mapbox.com'
51 });
52 return cb();
53 });
54
55 const unsubscribe = AWS.stub('SNS', 'unsubscribe', (opts, cb) => {
56 assert.deepEquals(opts, {
57 SubscriptionArn: 'arn:aws:sns:us-east-1:special-subscription'
58 });
59 return cb();
60 });
61
62 const listSubscriptionsByTopic = AWS.stub('SNS', 'listSubscriptionsByTopic')
63 .onCall(0)
64 .callsFake((opts, cb) => {
65 assert.deepEquals(opts, { TopicArn: 'arn:aws:sns:us-east-1:special-topic' });
66
67 return cb(null, {
68 Subscriptions: [{
69 Endpoint: 'the.wrong.email@mapbox.com'
70 }],
71 NextToken: 'this-tells-you-to-page'
72 });
73 })
74 .onCall(1)
75 .callsFake((opts, cb) => {
76 assert.deepEquals(opts, {
77 TopicArn: 'arn:aws:sns:us-east-1:special-topic',
78 NextToken: 'this-tells-you-to-page'
79 });
80
81 return cb(null, {
82 Subscriptions: [{
83 Endpoint: 'someone@mapbox.com',
84 SubscriptionArn: 'arn:aws:sns:us-east-1:special-subscription'
85 }]
86 });
87 });
88
89 const subscription = new SnsSubscription('arn:aws:sns:us-east-1:special-topic', 'email', 'someone-new@mapbox.com', 'someone@mapbox.com');
90
91 subscription.update((err) => {
92 assert.ifError(err, 'should not error');
93 assert.equals(subscribe.callCount, 1, 'subscribed called once');
94 assert.equals(unsubscribe.callCount, 1, 'unsubscribe called once');
95 assert.equals(listSubscriptionsByTopic.callCount, 2, 'listSubscriptionsByTopic called twice');
96 AWS.SNS.restore();
97 assert.end();
98 });
99});
100
101test('[sns-subscription] update still works when old subscription is not found', assert => {
102 const subscribe = AWS.stub('SNS', 'subscribe', (opts, cb) => {
103 assert.deepEquals(opts, {
104 Protocol: 'email',
105 TopicArn: 'arn:aws:sns:us-east-1:special-topic',
106 Endpoint: 'someone-new@mapbox.com'
107 });
108 return cb();
109 });
110
111 const unsubscribe = AWS.stub('SNS', 'unsubscribe', (opts, cb) => {
112 assert.deepEquals(opts, {
113 SubscriptionArn: 'arn:aws:sns:us-east-1:special-subscription'
114 });
115 return cb();
116 });
117
118 const listSubscriptionsByTopic = AWS.stub('SNS', 'listSubscriptionsByTopic', (opts, callback) => {
119 assert.deepEquals(opts, { TopicArn: 'arn:aws:sns:us-east-1:special-topic' });
120
121 return callback(null, {
122 Subscriptions: [{
123 Endpoint: 'the.wrong.email@mapbox.com',
124 SubscriptionArn: 'arn:aws:sns:us-east-1:special-subscription'
125 }]
126 });
127 });
128
129 const subscription = new SnsSubscription('arn:aws:sns:us-east-1:special-topic', 'email', 'someone-new@mapbox.com', 'someone@mapbox.com');
130
131 subscription.update((err) => {
132 assert.ifError(err, 'no error');
133 assert.equals(subscribe.callCount, 1, 'subscribe called once');
134 assert.equals(unsubscribe.callCount, 0, 'unsubscribe not called');
135 assert.equals(listSubscriptionsByTopic.callCount, 1, 'listSubscriptionsByTopic called once');
136 AWS.SNS.restore();
137 assert.end();
138 });
139});
140
141test('[sns-subscription] delete does same thing as update', assert => {
142 const unsubscribe = AWS.stub('SNS', 'unsubscribe', (opts, cb) => {
143 assert.deepEquals(opts, {
144 TopicArn: 'arn:special',
145 Subject: 'Thing to say',
146 Message: 'Specifics'
147 });
148 return cb();
149 });
150
151 const listSubscriptionsByTopic = AWS.stub('SNS', 'listSubscriptionsByTopic', (opts, callback) => {
152 assert.deepEquals(opts, { TopicArn: 'arn:aws:sns:us-east-1:special-topic' });
153 return callback(null, {
154 Subscriptions: [{
155 Endpoint: 'the.wrong.email@mapbox.com',
156 SubscriptionArn: 'arn:aws:sns:us-east-1:special-subscription'
157 }]
158 });
159 });
160
161 const subscription = new SnsSubscription('arn:aws:sns:us-east-1:special-topic', 'email', 'someone-new@mapbox.com', 'someone@mapbox.com');
162
163 subscription.delete((err) => {
164 assert.ifError(err, 'should not error');
165 assert.equals(unsubscribe.callCount, 0, 'unsubscribe not called');
166 assert.ok(listSubscriptionsByTopic.callCount > 0, 'listSubscriptionsByTopic called');
167 AWS.SNS.restore();
168 assert.end();
169 });
170});
171
172test('[sns-subscription] manage parses events and relays LatestStreamLabel through Response', assert => {
173 http.request = (options, cb) => {
174 return {
175 on: function() {
176 return this;
177 },
178 write: () => {},
179 end: () => {
180 return cb();
181 }
182 };
183 };
184 const subscribe = AWS.stub('SNS', 'subscribe', (opts, cb) => {
185 assert.deepEquals(opts, {
186 Protocol: 'sqs',
187 TopicArn: 'arn:special',
188 Endpoint: 'endpoint'
189 });
190 return cb();
191 });
192
193 SnsSubscription.manage({
194 ResponseURL: 'http://api.mapbox.com/hello',
195 PhysicalResourceId: 'abc',
196 StackId: 'abc',
197 LogicalResourceId: 'abc',
198 ResourceProperties: {
199 SnsTopicArn: 'arn:special',
200 Endpoint: 'endpoint',
201 Protocol: 'sqs'
202 },
203 RequestId: 'abc',
204 RequestType: 'CREATE'
205 }, {
206 done: (err, body) => {
207 assert.ifError(err, 'should not error');
208 assert.equals(JSON.parse(body).Status, 'SUCCESS');
209 subscribe.restore();
210 assert.end();
211 }
212 });
213});