punk 0.0.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (150) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +9 -0
  3. data/.github/workflows/ship.yml +28 -0
  4. data/.github/workflows/test.yml +45 -0
  5. data/.rdoc_options +23 -0
  6. data/.rgignore +1 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +243 -0
  9. data/Gemfile +6 -6
  10. data/Gemfile.lock +18 -30
  11. data/README.md +8 -0
  12. data/Rakefile +7 -9
  13. data/VERSION +1 -1
  14. data/app/migrations/001_lets_punk.rb +3 -0
  15. data/app/routes/hello.rb +4 -0
  16. data/bin/punk +0 -1
  17. data/env/.gitignore +3 -0
  18. data/env/spec/test.sh +3 -0
  19. data/env/test.sh +5 -0
  20. data/lib/punk/actions/.keep +0 -0
  21. data/lib/punk/actions/groups/list.rb +24 -0
  22. data/lib/punk/actions/sessions/clear.rb +21 -0
  23. data/lib/punk/actions/sessions/create.rb +64 -0
  24. data/lib/punk/actions/sessions/list.rb +18 -0
  25. data/lib/punk/actions/sessions/verify.rb +24 -0
  26. data/lib/punk/actions/tenants/list.rb +18 -0
  27. data/lib/punk/actions/users/list_group.rb +18 -0
  28. data/lib/punk/actions/users/list_tenant.rb +18 -0
  29. data/lib/punk/actions/users/show.rb +18 -0
  30. data/lib/punk/commands/http.rb +3 -3
  31. data/lib/punk/commands/list.rb +12 -6
  32. data/lib/punk/config/defaults.json +3 -0
  33. data/lib/punk/config/schema.json +3 -0
  34. data/lib/punk/core/app.rb +6 -8
  35. data/lib/punk/core/commander.rb +9 -6
  36. data/lib/punk/core/exec.rb +2 -0
  37. data/lib/punk/core/load.rb +0 -1
  38. data/lib/punk/framework/command.rb +5 -1
  39. data/lib/punk/framework/plugins/validation.rb +0 -14
  40. data/lib/punk/framework/runnable.rb +1 -1
  41. data/lib/punk/helpers/loggable.rb +1 -1
  42. data/lib/punk/migrations/001_punk.rb +103 -0
  43. data/lib/punk/models/.keep +0 -0
  44. data/lib/punk/models/group.rb +20 -0
  45. data/lib/punk/models/group_user_metadata.rb +17 -0
  46. data/lib/punk/models/identity.rb +29 -0
  47. data/lib/punk/models/session.rb +89 -0
  48. data/lib/punk/models/tenant.rb +19 -0
  49. data/lib/punk/models/tenant_user_metadata.rb +17 -0
  50. data/lib/punk/models/user.rb +31 -0
  51. data/lib/punk/routes/groups.rb +31 -0
  52. data/lib/punk/routes/plivo.rb +4 -0
  53. data/lib/punk/routes/sessions.rb +108 -0
  54. data/lib/punk/routes/swagger.rb +9 -0
  55. data/lib/punk/routes/tenants.rb +29 -0
  56. data/lib/punk/routes/users.rb +36 -0
  57. data/lib/punk/services/.keep +0 -0
  58. data/lib/punk/services/challenge_claim.rb +46 -0
  59. data/lib/punk/services/create_identities.rb +25 -0
  60. data/lib/punk/services/generate_swagger.rb +25 -0
  61. data/lib/punk/services/prove_claim.rb +29 -0
  62. data/lib/punk/services/secret.rb +9 -0
  63. data/lib/punk/templates/groups/list.jbuilder +7 -0
  64. data/lib/punk/templates/plivo.slim +16 -0
  65. data/lib/punk/templates/sessions/list.jbuilder +6 -0
  66. data/lib/punk/templates/sessions/pending.jbuilder +4 -0
  67. data/lib/punk/templates/tenants/list.jbuilder +7 -0
  68. data/lib/punk/templates/tenants/list.slim +8 -0
  69. data/lib/punk/templates/users/list.jbuilder +7 -0
  70. data/lib/punk/templates/users/list.rcsv +4 -0
  71. data/lib/punk/templates/users/show.jbuilder +5 -0
  72. data/lib/punk/views/groups/list.rb +22 -0
  73. data/lib/punk/views/plivo_store.rb +15 -0
  74. data/lib/punk/views/sessions/list.rb +22 -0
  75. data/lib/punk/views/sessions/pending.rb +28 -0
  76. data/lib/punk/views/tenants/list.rb +22 -0
  77. data/lib/punk/views/users/list.rb +22 -0
  78. data/lib/punk/views/users/show.rb +22 -0
  79. data/lib/punk/workers/.keep +0 -0
  80. data/lib/punk/workers/expire_sessions.rb +9 -0
  81. data/lib/punk/workers/geocode_session_worker.rb +48 -0
  82. data/lib/punk/workers/identify_session_worker.rb +45 -0
  83. data/lib/punk/workers/secret.rb +18 -0
  84. data/lib/punk/workers/send_email_worker.rb +51 -0
  85. data/lib/punk/workers/send_sms_worker.rb +40 -0
  86. data/punk.gemspec +149 -16
  87. data/schema.psql +345 -0
  88. data/spec/actions/groups/punk/list_groups_action_spec.rb +36 -0
  89. data/spec/actions/sessions/punk/clear_session_action_spec.rb +29 -0
  90. data/spec/actions/sessions/punk/create_session_action_spec.rb +33 -0
  91. data/spec/actions/sessions/punk/list_sessions_action_spec.rb +26 -0
  92. data/spec/actions/sessions/punk/verify_session_action_spec.rb +59 -0
  93. data/spec/actions/tenants/punk/list_tenants_action_spec.rb +25 -0
  94. data/spec/actions/users/punk/list_group_users_action_spec.rb +26 -0
  95. data/spec/actions/users/punk/list_tenant_users_action_spec.rb +26 -0
  96. data/spec/factories/group.rb +12 -0
  97. data/spec/factories/group_user_metadata.rb +10 -0
  98. data/spec/factories/identity.rb +19 -0
  99. data/spec/factories/session.rb +12 -0
  100. data/spec/factories/tenant.rb +10 -0
  101. data/spec/factories/tenant_user_metadata.rb +10 -0
  102. data/spec/factories/user.rb +12 -0
  103. data/spec/lib/commands/auth_spec.rb +11 -0
  104. data/spec/lib/commands/generate_spec.rb +7 -0
  105. data/spec/lib/commands/http_spec.rb +23 -0
  106. data/spec/lib/commands/list_spec.rb +7 -0
  107. data/spec/lib/commands/swagger_spec.rb +7 -0
  108. data/spec/lib/engine/punk_env_spec.rb +13 -0
  109. data/spec/lib/engine/punk_exec_spec.rb +9 -0
  110. data/spec/lib/engine/punk_init_spec.rb +9 -0
  111. data/spec/lib/engine/punk_store_spec.rb +10 -0
  112. data/spec/lib/punk.env +7 -0
  113. data/spec/models/punk/group_spec.rb +50 -0
  114. data/spec/models/punk/group_user_metadata_spec.rb +61 -0
  115. data/spec/models/punk/identity_spec.rb +61 -0
  116. data/spec/models/punk/session_spec.rb +156 -0
  117. data/spec/models/punk/tenant_spec.rb +51 -0
  118. data/spec/models/punk/tenant_user_metadata_spec.rb +61 -0
  119. data/spec/models/punk/user_spec.rb +115 -0
  120. data/spec/routes/groups/get_groups_spec.rb +33 -0
  121. data/spec/routes/plivo/get_plivo_spec.rb +11 -0
  122. data/spec/routes/sessions/delete_session_spec.rb +11 -0
  123. data/spec/routes/sessions/get_sessions_spec.rb +30 -0
  124. data/spec/routes/sessions/patch_session_spec.rb +11 -0
  125. data/spec/routes/sessions/post_session_spec.rb +11 -0
  126. data/spec/routes/swagger/get_swagger_spec.rb +12 -0
  127. data/spec/routes/tenants/get_tenants_spec.rb +31 -0
  128. data/spec/routes/users/get_users_spec.rb +60 -0
  129. data/spec/services/punk/challenge_claim_service_spec.rb +7 -0
  130. data/spec/services/punk/create_identities_service_spec.rb +14 -0
  131. data/spec/services/punk/generate_swagger_service_spec.rb +7 -0
  132. data/spec/services/punk/prove_claim_service_spec.rb +7 -0
  133. data/spec/services/punk/secret_service_spec.rb +7 -0
  134. data/spec/spec_helper.rb +122 -0
  135. data/spec/vcr_cassettes/PUNK_GeocodeSessionWorker/updates_the_session_data.yml +57 -0
  136. data/spec/vcr_cassettes/PUNK_IdentifySessionWorker/updates_the_session_data.yml +112 -0
  137. data/spec/views/punk/plivo_store_spec.rb +7 -0
  138. data/spec/views/sessions/punk/list_sessions_view_spec.rb +7 -0
  139. data/spec/views/sessions/punk/pending_session_view_spec.rb +7 -0
  140. data/spec/views/tenants/punk/list_tenants_view_spec.rb +7 -0
  141. data/spec/views/users/punk/list_groups_view_spec.rb +7 -0
  142. data/spec/views/users/punk/list_users_view_spec.rb +7 -0
  143. data/spec/workers/punk/expire_sessions_worker_spec.rb +31 -0
  144. data/spec/workers/punk/geocode_session_worker_spec.rb +14 -0
  145. data/spec/workers/punk/identify_session_worker_spec.rb +15 -0
  146. data/spec/workers/punk/secret_worker_spec.rb +20 -0
  147. data/spec/workers/punk/send_email_worker_spec.rb +46 -0
  148. data/spec/workers/punk/send_sms_worker_spec.rb +33 -0
  149. metadata +169 -13
  150. data/lib/punk/views/all.rb +0 -4
@@ -0,0 +1,345 @@
1
+ --
2
+ -- PostgreSQL database dump
3
+ --
4
+
5
+ -- Dumped from database version 13.1
6
+ -- Dumped by pg_dump version 13.1
7
+
8
+ SET statement_timeout = 0;
9
+ SET lock_timeout = 0;
10
+ SET idle_in_transaction_session_timeout = 0;
11
+ SET client_encoding = 'UTF8';
12
+ SET standard_conforming_strings = on;
13
+ SELECT pg_catalog.set_config('search_path', '', false);
14
+ SET check_function_bodies = false;
15
+ SET xmloption = content;
16
+ SET client_min_messages = warning;
17
+ SET row_security = off;
18
+
19
+ --
20
+ -- Name: claim_type; Type: TYPE; Schema: public; Owner: jason
21
+ --
22
+
23
+ CREATE TYPE public.claim_type AS ENUM (
24
+ 'email',
25
+ 'phone'
26
+ );
27
+
28
+
29
+ ALTER TYPE public.claim_type OWNER TO jason;
30
+
31
+ --
32
+ -- Name: punk_state; Type: TYPE; Schema: public; Owner: jason
33
+ --
34
+
35
+ CREATE TYPE public.punk_state AS ENUM (
36
+ 'created',
37
+ 'active',
38
+ 'deleted'
39
+ );
40
+
41
+
42
+ ALTER TYPE public.punk_state OWNER TO jason;
43
+
44
+ --
45
+ -- Name: session_state; Type: TYPE; Schema: public; Owner: jason
46
+ --
47
+
48
+ CREATE TYPE public.session_state AS ENUM (
49
+ 'pending',
50
+ 'created',
51
+ 'active',
52
+ 'deleted',
53
+ 'expired'
54
+ );
55
+
56
+
57
+ ALTER TYPE public.session_state OWNER TO jason;
58
+
59
+ SET default_tablespace = '';
60
+
61
+ SET default_table_access_method = heap;
62
+
63
+ --
64
+ -- Name: groups; Type: TABLE; Schema: public; Owner: jason
65
+ --
66
+
67
+ CREATE TABLE public.groups (
68
+ id uuid DEFAULT gen_random_uuid() NOT NULL,
69
+ state public.punk_state DEFAULT 'created'::public.punk_state NOT NULL,
70
+ name text NOT NULL,
71
+ icon text,
72
+ data jsonb DEFAULT '{}'::jsonb,
73
+ created_at timestamp with time zone,
74
+ updated_at timestamp with time zone,
75
+ tenant_id uuid NOT NULL
76
+ );
77
+
78
+
79
+ ALTER TABLE public.groups OWNER TO jason;
80
+
81
+ --
82
+ -- Name: groups_users; Type: TABLE; Schema: public; Owner: jason
83
+ --
84
+
85
+ CREATE TABLE public.groups_users (
86
+ group_id uuid NOT NULL,
87
+ user_id uuid NOT NULL
88
+ );
89
+
90
+
91
+ ALTER TABLE public.groups_users OWNER TO jason;
92
+
93
+ --
94
+ -- Name: identities; Type: TABLE; Schema: public; Owner: jason
95
+ --
96
+
97
+ CREATE TABLE public.identities (
98
+ id uuid DEFAULT gen_random_uuid() NOT NULL,
99
+ state public.punk_state DEFAULT 'created'::public.punk_state NOT NULL,
100
+ claim_type public.claim_type NOT NULL,
101
+ claim text NOT NULL,
102
+ data jsonb DEFAULT '{}'::jsonb,
103
+ created_at timestamp with time zone,
104
+ updated_at timestamp with time zone,
105
+ user_id uuid
106
+ );
107
+
108
+
109
+ ALTER TABLE public.identities OWNER TO jason;
110
+
111
+ --
112
+ -- Name: schema_info; Type: TABLE; Schema: public; Owner: jason
113
+ --
114
+
115
+ CREATE TABLE public.schema_info (
116
+ version integer DEFAULT 0 NOT NULL
117
+ );
118
+
119
+
120
+ ALTER TABLE public.schema_info OWNER TO jason;
121
+
122
+ --
123
+ -- Name: sessions; Type: TABLE; Schema: public; Owner: jason
124
+ --
125
+
126
+ CREATE TABLE public.sessions (
127
+ id uuid DEFAULT gen_random_uuid() NOT NULL,
128
+ slug uuid DEFAULT gen_random_uuid(),
129
+ state public.session_state DEFAULT 'created'::public.session_state NOT NULL,
130
+ salt bytea,
131
+ hash bytea,
132
+ attempt_count integer DEFAULT 0 NOT NULL,
133
+ remote_addr cidr DEFAULT '127.0.0.1/32'::cidr NOT NULL,
134
+ user_agent text DEFAULT 'Mozilla/5.0 (compatible; Punk!; +https://punk.kranzky.com)'::text NOT NULL,
135
+ data jsonb DEFAULT '{}'::jsonb,
136
+ created_at timestamp with time zone,
137
+ updated_at timestamp with time zone,
138
+ identity_id uuid NOT NULL
139
+ );
140
+
141
+
142
+ ALTER TABLE public.sessions OWNER TO jason;
143
+
144
+ --
145
+ -- Name: tenants; Type: TABLE; Schema: public; Owner: jason
146
+ --
147
+
148
+ CREATE TABLE public.tenants (
149
+ id uuid DEFAULT gen_random_uuid() NOT NULL,
150
+ state public.punk_state DEFAULT 'created'::public.punk_state NOT NULL,
151
+ name text NOT NULL,
152
+ icon text,
153
+ data jsonb DEFAULT '{}'::jsonb,
154
+ created_at timestamp with time zone,
155
+ updated_at timestamp with time zone
156
+ );
157
+
158
+
159
+ ALTER TABLE public.tenants OWNER TO jason;
160
+
161
+ --
162
+ -- Name: tenants_users; Type: TABLE; Schema: public; Owner: jason
163
+ --
164
+
165
+ CREATE TABLE public.tenants_users (
166
+ tenant_id uuid NOT NULL,
167
+ user_id uuid NOT NULL
168
+ );
169
+
170
+
171
+ ALTER TABLE public.tenants_users OWNER TO jason;
172
+
173
+ --
174
+ -- Name: users; Type: TABLE; Schema: public; Owner: jason
175
+ --
176
+
177
+ CREATE TABLE public.users (
178
+ id uuid DEFAULT gen_random_uuid() NOT NULL,
179
+ state public.punk_state DEFAULT 'created'::public.punk_state NOT NULL,
180
+ name text NOT NULL,
181
+ icon text,
182
+ email text,
183
+ phone text,
184
+ data jsonb DEFAULT '{}'::jsonb,
185
+ created_at timestamp with time zone,
186
+ updated_at timestamp with time zone
187
+ );
188
+
189
+
190
+ ALTER TABLE public.users OWNER TO jason;
191
+
192
+ --
193
+ -- Name: groups groups_pkey; Type: CONSTRAINT; Schema: public; Owner: jason
194
+ --
195
+
196
+ ALTER TABLE ONLY public.groups
197
+ ADD CONSTRAINT groups_pkey PRIMARY KEY (id);
198
+
199
+
200
+ --
201
+ -- Name: groups_users groups_users_pkey; Type: CONSTRAINT; Schema: public; Owner: jason
202
+ --
203
+
204
+ ALTER TABLE ONLY public.groups_users
205
+ ADD CONSTRAINT groups_users_pkey PRIMARY KEY (group_id, user_id);
206
+
207
+
208
+ --
209
+ -- Name: identities identities_claim_key; Type: CONSTRAINT; Schema: public; Owner: jason
210
+ --
211
+
212
+ ALTER TABLE ONLY public.identities
213
+ ADD CONSTRAINT identities_claim_key UNIQUE (claim);
214
+
215
+
216
+ --
217
+ -- Name: identities identities_pkey; Type: CONSTRAINT; Schema: public; Owner: jason
218
+ --
219
+
220
+ ALTER TABLE ONLY public.identities
221
+ ADD CONSTRAINT identities_pkey PRIMARY KEY (id);
222
+
223
+
224
+ --
225
+ -- Name: sessions sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: jason
226
+ --
227
+
228
+ ALTER TABLE ONLY public.sessions
229
+ ADD CONSTRAINT sessions_pkey PRIMARY KEY (id);
230
+
231
+
232
+ --
233
+ -- Name: tenants tenants_pkey; Type: CONSTRAINT; Schema: public; Owner: jason
234
+ --
235
+
236
+ ALTER TABLE ONLY public.tenants
237
+ ADD CONSTRAINT tenants_pkey PRIMARY KEY (id);
238
+
239
+
240
+ --
241
+ -- Name: tenants_users tenants_users_pkey; Type: CONSTRAINT; Schema: public; Owner: jason
242
+ --
243
+
244
+ ALTER TABLE ONLY public.tenants_users
245
+ ADD CONSTRAINT tenants_users_pkey PRIMARY KEY (tenant_id, user_id);
246
+
247
+
248
+ --
249
+ -- Name: users users_email_key; Type: CONSTRAINT; Schema: public; Owner: jason
250
+ --
251
+
252
+ ALTER TABLE ONLY public.users
253
+ ADD CONSTRAINT users_email_key UNIQUE (email);
254
+
255
+
256
+ --
257
+ -- Name: users users_phone_key; Type: CONSTRAINT; Schema: public; Owner: jason
258
+ --
259
+
260
+ ALTER TABLE ONLY public.users
261
+ ADD CONSTRAINT users_phone_key UNIQUE (phone);
262
+
263
+
264
+ --
265
+ -- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: jason
266
+ --
267
+
268
+ ALTER TABLE ONLY public.users
269
+ ADD CONSTRAINT users_pkey PRIMARY KEY (id);
270
+
271
+
272
+ --
273
+ -- Name: groups_users_group_id_user_id_index; Type: INDEX; Schema: public; Owner: jason
274
+ --
275
+
276
+ CREATE INDEX groups_users_group_id_user_id_index ON public.groups_users USING btree (group_id, user_id);
277
+
278
+
279
+ --
280
+ -- Name: tenants_users_tenant_id_user_id_index; Type: INDEX; Schema: public; Owner: jason
281
+ --
282
+
283
+ CREATE INDEX tenants_users_tenant_id_user_id_index ON public.tenants_users USING btree (tenant_id, user_id);
284
+
285
+
286
+ --
287
+ -- Name: groups groups_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: jason
288
+ --
289
+
290
+ ALTER TABLE ONLY public.groups
291
+ ADD CONSTRAINT groups_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id);
292
+
293
+
294
+ --
295
+ -- Name: groups_users groups_users_group_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: jason
296
+ --
297
+
298
+ ALTER TABLE ONLY public.groups_users
299
+ ADD CONSTRAINT groups_users_group_id_fkey FOREIGN KEY (group_id) REFERENCES public.groups(id);
300
+
301
+
302
+ --
303
+ -- Name: groups_users groups_users_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: jason
304
+ --
305
+
306
+ ALTER TABLE ONLY public.groups_users
307
+ ADD CONSTRAINT groups_users_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id);
308
+
309
+
310
+ --
311
+ -- Name: identities identities_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: jason
312
+ --
313
+
314
+ ALTER TABLE ONLY public.identities
315
+ ADD CONSTRAINT identities_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id);
316
+
317
+
318
+ --
319
+ -- Name: sessions sessions_identity_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: jason
320
+ --
321
+
322
+ ALTER TABLE ONLY public.sessions
323
+ ADD CONSTRAINT sessions_identity_id_fkey FOREIGN KEY (identity_id) REFERENCES public.identities(id);
324
+
325
+
326
+ --
327
+ -- Name: tenants_users tenants_users_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: jason
328
+ --
329
+
330
+ ALTER TABLE ONLY public.tenants_users
331
+ ADD CONSTRAINT tenants_users_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id);
332
+
333
+
334
+ --
335
+ -- Name: tenants_users tenants_users_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: jason
336
+ --
337
+
338
+ ALTER TABLE ONLY public.tenants_users
339
+ ADD CONSTRAINT tenants_users_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id);
340
+
341
+
342
+ --
343
+ -- PostgreSQL database dump complete
344
+ --
345
+
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe PUNK::ListGroupsAction do
4
+ let(:user) { create(:user) }
5
+ let(:tenant) { create(:tenant) }
6
+
7
+ context 'with no user provided' do
8
+ it 'returns a validation error' do
9
+ view = described_class.run(tenant: tenant).result.render(:json)
10
+ expect(view).to match('user is not present')
11
+ end
12
+ end
13
+
14
+ context 'with no tenant provided' do
15
+ it 'returns a validation error' do
16
+ view = described_class.run(user: user).result.render(:json)
17
+ expect(view).to match('tenant is not present')
18
+ end
19
+ end
20
+
21
+ context 'with valid arguments' do
22
+ let(:groups) { create_list(:group, 3, tenant: tenant) }
23
+
24
+ before do
25
+ user.add_tenant(tenant)
26
+ groups[0].add_user(user)
27
+ groups[1].add_user(user)
28
+ end
29
+
30
+ it 'returns groups for the tenant that the user is a member of' do
31
+ expect(tenant.groups.count).to eq(3)
32
+ view = JSON.parse(described_class.run(user: user, tenant: tenant).result.render(:json))
33
+ expect(view.map { |h| h['id'] }.sort).to eq([groups[0].id, groups[1].id].sort)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe PUNK::ClearSessionAction do
4
+ context 'with no session provided' do
5
+ it 'returns a validation error' do
6
+ view = described_class.run.result.render(:json)
7
+ expect(view).to match('session is not present')
8
+ expect(view).to match('session is empty')
9
+ end
10
+ end
11
+
12
+ context 'with an inactive session provided' do
13
+ it 'returns a validation error' do
14
+ session = create(:session)
15
+ view = described_class.run(session: session).result.render(:json)
16
+ expect(view).to match('session is not in active state')
17
+ expect(view).to match('session may not clear')
18
+ end
19
+ end
20
+
21
+ context 'with an active session provided' do
22
+ it 'clears the session' do
23
+ session = create(:session, state: :active)
24
+ view = described_class.run(session: session).result.render(:json)
25
+ expect(view).to match('You have been logged out')
26
+ expect(session.deleted?).to be(true)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe PUNK::CreateSessionAction do
4
+ let(:remote_addr) { Faker::Internet.ip_v4_address }
5
+ let(:user_agent) { Faker::Internet.user_agent }
6
+
7
+ context 'with no claim provided' do
8
+ it 'returns a validation error' do
9
+ view = described_class.run(remote_addr: remote_addr, user_agent: user_agent).result.render(:json)
10
+ expect(view).to match('claim is not present')
11
+ end
12
+ end
13
+
14
+ context 'with an email claim provided' do
15
+ it 'created an identity and a session' do
16
+ email = Faker::Internet.email
17
+ view = described_class.run(claim: email, remote_addr: remote_addr, user_agent: user_agent).result.render(:json)
18
+ session = PUNK::Session.find(slug: ActiveSupport::JSON.decode(view)['slug'])
19
+ expect(session.identity.claim_type).to eq(:email)
20
+ expect(session.identity.claim).to eq(email)
21
+ end
22
+ end
23
+
24
+ context 'with a phone claim provided' do
25
+ it 'created an identity and a session' do
26
+ phone = generate(:phone)
27
+ view = described_class.run(claim: phone, remote_addr: remote_addr, user_agent: user_agent).result.render(:json)
28
+ session = PUNK::Session.find(slug: ActiveSupport::JSON.decode(view)['slug'])
29
+ expect(session.identity.claim_type).to eq(:phone)
30
+ expect(session.identity.claim).to eq(phone)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe PUNK::ListSessionsAction do
4
+ context 'with no user provided' do
5
+ it 'returns a validation error' do
6
+ view = described_class.run.result.render(:json)
7
+ expect(view).to match('user is not present')
8
+ end
9
+ end
10
+
11
+ context 'with a user provided' do
12
+ let(:user) { create(:user) }
13
+ let(:identity) { create(:identity, user: user) }
14
+
15
+ before do
16
+ create_list(:session, 3, state: 'active')
17
+ create_list(:session, 3, state: 'active', identity: identity)
18
+ end
19
+
20
+ it 'returns active sessions that the user belongs to' do
21
+ expect(PUNK::Session.count).to eq(6)
22
+ view = JSON.parse(described_class.run(user: user).result.render(:json))
23
+ expect(view.map { |h| h['id'] }.sort).to eq(user.active_sessions.map(&:id).sort)
24
+ end
25
+ end
26
+ end