unsakini 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +34 -0
  5. data/angular/README.md +31 -0
  6. data/angular/angular-cli.json +59 -0
  7. data/angular/karma.conf.js +45 -0
  8. data/angular/package.json +49 -0
  9. data/angular/protractor.conf.js +32 -0
  10. data/angular/src/app/app.component.css +0 -0
  11. data/angular/src/app/app.component.html +4 -0
  12. data/angular/src/app/app.component.spec.ts +47 -0
  13. data/angular/src/app/app.component.ts +10 -0
  14. data/angular/src/app/app.module.ts +29 -0
  15. data/angular/src/app/app.routes.module.ts +29 -0
  16. data/angular/src/app/index.ts +2 -0
  17. data/angular/src/app/registration/registration.component.css +0 -0
  18. data/angular/src/app/registration/registration.component.html +14 -0
  19. data/angular/src/app/registration/registration.component.spec.ts +157 -0
  20. data/angular/src/app/registration/registration.component.ts +42 -0
  21. data/angular/src/environments/environment.prod.ts +3 -0
  22. data/angular/src/environments/environment.ts +8 -0
  23. data/angular/src/favicon.ico +0 -0
  24. data/angular/src/index.html +14 -0
  25. data/angular/src/main.ts +12 -0
  26. data/angular/src/polyfills.ts +19 -0
  27. data/angular/src/styles.css +1 -0
  28. data/angular/src/test.ts +31 -0
  29. data/angular/src/tsconfig.json +18 -0
  30. data/angular/src/typings.d.ts +2 -0
  31. data/angular/tslint.json +114 -0
  32. data/angular/typings.json +4 -0
  33. data/app/controllers/api/boards_controller.rb +67 -0
  34. data/app/controllers/api/comments_controller.rb +51 -0
  35. data/app/controllers/api/posts_controller.rb +58 -0
  36. data/app/controllers/api/share_board_controller.rb +118 -0
  37. data/app/controllers/api/users_controller.rb +27 -0
  38. data/app/controllers/application_controller.rb +5 -0
  39. data/app/controllers/concerns/board_owner_controller_concern.rb +38 -0
  40. data/app/controllers/concerns/comment_owner_controller_concern.rb +33 -0
  41. data/app/controllers/concerns/logged_in_controller_concern.rb +21 -0
  42. data/app/controllers/concerns/post_owner_controller_concern.rb +36 -0
  43. data/app/controllers/concerns/serializer_controller_concern.rb +11 -0
  44. data/app/controllers/user_token_controller.rb +2 -0
  45. data/app/controllers/web_base_controller.rb +11 -0
  46. data/app/models/application_record.rb +5 -0
  47. data/app/models/board.rb +14 -0
  48. data/app/models/comment.rb +9 -0
  49. data/app/models/concerns/encryptable_model_concern.rb +96 -0
  50. data/app/models/post.rb +12 -0
  51. data/app/models/user.rb +6 -0
  52. data/app/models/user_board.rb +71 -0
  53. data/app/serializers/board_serializer.rb +5 -0
  54. data/app/serializers/comment_serializer.rb +10 -0
  55. data/app/serializers/post_serializer.rb +23 -0
  56. data/app/serializers/user_board_serializer.rb +10 -0
  57. data/app/serializers/user_serializer.rb +6 -0
  58. data/config/initializers/unsakini.rb +4 -0
  59. data/config/routes.rb +22 -0
  60. data/db/migrate/20161116114222_create_boards.rb +9 -0
  61. data/db/migrate/20161116200034_create_user_boards.rb +11 -0
  62. data/db/migrate/20161118031023_create_posts.rb +12 -0
  63. data/db/migrate/20161118100454_create_comments.rb +11 -0
  64. data/db/migrate/20161118221508_add_encrypted_password_to_user_board.rb +5 -0
  65. data/db/migrate/20161122211105_create_users.rb +12 -0
  66. data/lib/generators/unsakini/angular/USAGE +8 -0
  67. data/lib/generators/unsakini/angular/angular_generator.rb +7 -0
  68. data/lib/generators/unsakini/config/USAGE +8 -0
  69. data/lib/generators/unsakini/config/config_generator.rb +7 -0
  70. data/lib/generators/unsakini/config/templates/unsakini.rb +4 -0
  71. data/lib/tasks/unsakini_tasks.rake +33 -0
  72. data/lib/unsakini/engine.rb +30 -0
  73. data/lib/unsakini/version.rb +3 -0
  74. data/lib/unsakini.rb +5 -0
  75. data/spec/concerns/models/encryptable_concern.rb +40 -0
  76. data/spec/dummy/Rakefile +6 -0
  77. data/spec/dummy/angular/README.md +31 -0
  78. data/spec/dummy/angular/angular-cli.json +59 -0
  79. data/spec/dummy/angular/e2e/app.e2e-spec.ts +14 -0
  80. data/spec/dummy/angular/e2e/app.po.ts +11 -0
  81. data/spec/dummy/angular/e2e/signup.e2e-spec.ts +28 -0
  82. data/spec/dummy/angular/e2e/signup.po.ts +31 -0
  83. data/spec/dummy/angular/e2e/tsconfig.json +16 -0
  84. data/spec/dummy/angular/karma.conf.js +45 -0
  85. data/spec/dummy/angular/package.json +50 -0
  86. data/spec/dummy/angular/protractor.conf.js +32 -0
  87. data/spec/dummy/angular/src/app/app.component.css +0 -0
  88. data/spec/dummy/angular/src/app/app.component.html +4 -0
  89. data/spec/dummy/angular/src/app/app.component.spec.ts +47 -0
  90. data/spec/dummy/angular/src/app/app.component.ts +10 -0
  91. data/spec/dummy/angular/src/app/app.module.ts +29 -0
  92. data/spec/dummy/angular/src/app/app.routes.module.ts +29 -0
  93. data/spec/dummy/angular/src/app/index.ts +2 -0
  94. data/spec/dummy/angular/src/app/registration/registration.component.css +0 -0
  95. data/spec/dummy/angular/src/app/registration/registration.component.html +14 -0
  96. data/spec/dummy/angular/src/app/registration/registration.component.spec.ts +157 -0
  97. data/spec/dummy/angular/src/app/registration/registration.component.ts +42 -0
  98. data/spec/dummy/angular/src/environments/environment.prod.ts +3 -0
  99. data/spec/dummy/angular/src/environments/environment.ts +8 -0
  100. data/spec/dummy/angular/src/favicon.ico +0 -0
  101. data/spec/dummy/angular/src/index.html +14 -0
  102. data/spec/dummy/angular/src/main.ts +12 -0
  103. data/spec/dummy/angular/src/polyfills.ts +19 -0
  104. data/spec/dummy/angular/src/styles.css +1 -0
  105. data/spec/dummy/angular/src/test.ts +31 -0
  106. data/spec/dummy/angular/src/tsconfig.json +18 -0
  107. data/spec/dummy/angular/src/typings.d.ts +2 -0
  108. data/spec/dummy/angular/tslint.json +114 -0
  109. data/spec/dummy/angular/typings.json +4 -0
  110. data/spec/dummy/app/assets/config/manifest.js +3 -0
  111. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  112. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  113. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  114. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  115. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  116. data/spec/dummy/app/jobs/application_job.rb +2 -0
  117. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  118. data/spec/dummy/app/models/application_record.rb +3 -0
  119. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  120. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  121. data/spec/dummy/bin/bundle +3 -0
  122. data/spec/dummy/bin/rails +4 -0
  123. data/spec/dummy/bin/rake +4 -0
  124. data/spec/dummy/bin/setup +34 -0
  125. data/spec/dummy/bin/update +29 -0
  126. data/spec/dummy/config/application.rb +22 -0
  127. data/spec/dummy/config/boot.rb +5 -0
  128. data/spec/dummy/config/cable.yml +9 -0
  129. data/spec/dummy/config/crypto.yml +7 -0
  130. data/spec/dummy/config/database.yml +25 -0
  131. data/spec/dummy/config/environment.rb +5 -0
  132. data/spec/dummy/config/environments/development.rb +47 -0
  133. data/spec/dummy/config/environments/production.rb +78 -0
  134. data/spec/dummy/config/environments/test.rb +42 -0
  135. data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
  136. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  137. data/spec/dummy/config/initializers/cors.rb +16 -0
  138. data/spec/dummy/config/initializers/inflections.rb +16 -0
  139. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  140. data/spec/dummy/config/initializers/new_framework_defaults.rb +18 -0
  141. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  142. data/spec/dummy/config/locales/en.yml +23 -0
  143. data/spec/dummy/config/puma.rb +47 -0
  144. data/spec/dummy/config/routes.rb +3 -0
  145. data/spec/dummy/config/secrets.yml +22 -0
  146. data/spec/dummy/config/spring.rb +6 -0
  147. data/spec/dummy/config.ru +5 -0
  148. data/spec/dummy/db/development.sqlite3 +0 -0
  149. data/spec/dummy/db/schema.rb +56 -0
  150. data/spec/dummy/db/test.sqlite3 +0 -0
  151. data/spec/dummy/public/app/favicon.ico +0 -0
  152. data/spec/dummy/public/app/index.html +14 -0
  153. data/spec/dummy/public/app/inline.bundle.js +139 -0
  154. data/spec/dummy/public/app/inline.map +1 -0
  155. data/spec/dummy/public/app/main.bundle.js +64689 -0
  156. data/spec/dummy/public/app/main.map +1 -0
  157. data/spec/dummy/public/app/styles.bundle.js +364 -0
  158. data/spec/dummy/public/app/styles.map +1 -0
  159. data/spec/factories/boards.rb +5 -0
  160. data/spec/factories/comments.rb +7 -0
  161. data/spec/factories/posts.rb +8 -0
  162. data/spec/factories/user_boards.rb +9 -0
  163. data/spec/factories/users.rb +10 -0
  164. data/spec/models/board_spec.rb +19 -0
  165. data/spec/models/comment_spec.rb +26 -0
  166. data/spec/models/post_spec.rb +19 -0
  167. data/spec/models/user_board_spec.rb +193 -0
  168. data/spec/models/user_spec.rb +5 -0
  169. data/spec/rails_helper.rb +58 -0
  170. data/spec/requests/api/api_boards_spec.rb +238 -0
  171. data/spec/requests/api/api_share_board_spec.rb +167 -0
  172. data/spec/requests/api/api_users_spec.rb +52 -0
  173. data/spec/requests/api/board/api_board_posts_spec.rb +299 -0
  174. data/spec/requests/api/board/post/api_board_post_comments_spec.rb +370 -0
  175. data/spec/requests/render_app_index_spec.rb +19 -0
  176. data/spec/schema/board.json +39 -0
  177. data/spec/schema/comment.json +51 -0
  178. data/spec/schema/post.json +87 -0
  179. data/spec/schema/user.json +27 -0
  180. data/spec/spec_helper.rb +67 -0
  181. data/spec/support/auth_helper.rb +17 -0
  182. data/spec/support/scenario_helper.rb +134 -0
  183. data/spec/support/serialize_helper.rb +37 -0
  184. metadata +540 -0
@@ -0,0 +1,370 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe "Api::Board::Post::Comments", type: :request do
4
+
5
+ before(:all) do
6
+ user_has_shared_board_with_posts_scenario
7
+ end
8
+
9
+ let(:valid_attributes) {
10
+ {content: Faker::Hacker.say_something_smart}
11
+ }
12
+
13
+ let(:invalid_attributes) {
14
+ {content: nil}
15
+ }
16
+
17
+ context "Private board" do
18
+
19
+ context "Comments on my post" do
20
+
21
+ it "returns http unauthorized" do
22
+ get api_board_post_comments_path(@board, @post)
23
+ expect(response).to have_http_status(:unauthorized)
24
+ end
25
+
26
+ it "returns http unauthorized" do
27
+ put api_board_post_comment_path(@board, @post, @comment), params: valid_attributes, as: :json
28
+ expect(response).to have_http_status(:unauthorized)
29
+ end
30
+
31
+
32
+ describe "Get all comments on my post" do
33
+ describe "As a post owner" do
34
+ it "returns all comments" do
35
+ get api_board_post_comments_path(@board, @post), headers: auth_headers(@user)
36
+ expect(response).to have_http_status(:ok)
37
+ expect(body_to_json('0')).to match_json_schema(:comment)
38
+ expect(body_to_json.count).to eq @post.comments.count
39
+ end
40
+ end
41
+
42
+ describe "As another user" do
43
+ it "returns http forbidden" do
44
+ get api_board_post_comments_path(@board, @post), headers: auth_headers(@user_2)
45
+ expect(response).to have_http_status(:forbidden)
46
+ end
47
+
48
+ it "returns http forbidden" do
49
+ get api_board_post_comments_path(@shared_board, @post), headers: auth_headers(@user_2)
50
+ expect(response).to have_http_status(:forbidden)
51
+ end
52
+ end
53
+
54
+ end
55
+
56
+ describe "Creating comment to my post" do
57
+
58
+ describe "As post owner" do
59
+
60
+ it "returns http unauthorized" do
61
+ post api_board_post_comments_path(@board, @post), as: :json, params: valid_attributes
62
+ expect(response).to have_http_status(:unauthorized)
63
+ end
64
+
65
+ it "returns http unprocessable_entity" do
66
+ post(
67
+ api_board_post_comments_path(@board, @post),
68
+ headers: auth_headers(@user),
69
+ params: invalid_attributes,
70
+ as: :json
71
+ )
72
+ expect(response).to have_http_status(:unprocessable_entity)
73
+ #todo: assert errors
74
+ end
75
+
76
+ it "creates a new comment" do
77
+ comment_count = @post.comments.count
78
+ post(
79
+ api_board_post_comments_path(@board, @post),
80
+ headers: auth_headers(@user),
81
+ params: valid_attributes,
82
+ as: :json
83
+ )
84
+ expect(response).to have_http_status(:ok)
85
+ expect(response.body).to match_json_schema(:comment)
86
+ expect(body_to_json('id')).to eq @post.comments.last.id
87
+ expect(body_to_json('user/id')).to eq @user.id
88
+ expect(Comment.find_by_id(body_to_json('id'))).to eq @post.comments.last
89
+ expect(@post.comments.count).to eq(comment_count+1)
90
+ end
91
+ end
92
+
93
+ describe "As another user" do
94
+
95
+ it "returns http unauthorized" do
96
+ post api_board_post_comments_path(@board, @post), as: :json, params: valid_attributes
97
+ expect(response).to have_http_status(:unauthorized)
98
+ end
99
+
100
+ it "returns http forbidden" do
101
+ post(
102
+ api_board_post_comments_path(@board, @post),
103
+ headers: auth_headers(@user_2),
104
+ params: valid_attributes,
105
+ as: :json
106
+ )
107
+ expect(response).to have_http_status(:forbidden)
108
+ end
109
+
110
+ end
111
+
112
+ end
113
+
114
+ describe "Updating my comment on my post" do
115
+
116
+ describe "As comment owner" do
117
+
118
+ it "updates my comment if user is me" do
119
+ put(
120
+ api_board_post_comment_path(@board, @post, @comment),
121
+ params: valid_attributes,
122
+ headers: auth_headers(@user),
123
+ as: :json
124
+ )
125
+ expect(response).to have_http_status(:ok)
126
+ expect(response.body).to match_json_schema(:comment)
127
+ expect(body_to_json('content')).to eq @comment.reload.content
128
+ expect(@comment.content).to eq(valid_attributes[:content])
129
+ end
130
+ end
131
+
132
+ describe "As another user" do
133
+
134
+ it "returns http forbidden if not comment owner" do
135
+ put(
136
+ api_board_post_comment_path(@board, @post, @comment),
137
+ params: valid_attributes,
138
+ headers: auth_headers(@user_2),
139
+ as: :json
140
+ )
141
+ expect(response).to have_http_status(:forbidden)
142
+ end
143
+
144
+ end
145
+
146
+ end
147
+
148
+ describe "Deleting my comment on my post" do
149
+
150
+ describe "As comment owner" do
151
+
152
+ it "Deletes my comment if user is me" do
153
+ prev_comment_count = @post.comments.count
154
+ delete(
155
+ api_board_post_comment_path(@board, @post, @comment),
156
+ headers: auth_headers(@user),
157
+ )
158
+ expect(response).to have_http_status(:ok)
159
+ expect(@post.comments.count).to eq(prev_comment_count-1)
160
+ expect(Comment.find_by_id(@comment.id)).to be_nil
161
+ end
162
+
163
+ end
164
+
165
+ describe "As another user" do
166
+
167
+ it "returns http forbidden if not comment owner" do
168
+ prev_comment_count = @post.comments.count
169
+ delete(
170
+ api_board_post_comment_path(@board, @post, @comment),
171
+ headers: auth_headers(@user_2),
172
+ )
173
+ expect(response).to have_http_status(:forbidden)
174
+ expect(@post.comments.count).to eq(prev_comment_count)
175
+ expect(Comment.find_by_id(@comment.id)).not_to be_nil
176
+ end
177
+
178
+ it "Deletes my comment if user is me" do
179
+ prev_comment_count = @post.comments.count
180
+ delete(
181
+ api_board_post_comment_path(@board, @post, @comment),
182
+ headers: auth_headers(@user),
183
+ )
184
+ expect(response).to have_http_status(:ok)
185
+ expect(@post.comments.count).to eq(prev_comment_count-1)
186
+ expect(Comment.find_by_id(@comment.id)).to be_nil
187
+ end
188
+
189
+ end
190
+
191
+ end
192
+
193
+ end
194
+
195
+ end
196
+
197
+ context "Shared Board" do
198
+
199
+ context "Comments on My Post" do
200
+
201
+ describe "Get all comments on my post" do
202
+
203
+ describe "As a post owner" do
204
+
205
+ it "returns all comments" do
206
+ get api_board_post_comments_path(@shared_board, @shared_post), headers: auth_headers(@user)
207
+ expect(response).to have_http_status(:ok)
208
+ expect(body_to_json('0')).to match_json_schema(:comment)
209
+ expect(body_to_json.count).to eq @shared_post.comments.count
210
+ end
211
+
212
+ end
213
+
214
+ describe "As another user" do
215
+ it "returns all comments" do
216
+ get api_board_post_comments_path(@shared_board, @shared_post), headers: auth_headers(@user_2)
217
+ expect(response).to have_http_status(:ok)
218
+ expect(body_to_json('0')).to match_json_schema(:comment)
219
+ expect(body_to_json.count).to eq @shared_post.comments.count
220
+ end
221
+ end
222
+
223
+ end
224
+
225
+ describe "Creating comment to my post" do
226
+
227
+ context "As post owner" do
228
+
229
+ it "returns http unprocessable_entity" do
230
+ post(
231
+ api_board_post_comments_path(@shared_board, @shared_post),
232
+ headers: auth_headers(@user),
233
+ params: invalid_attributes,
234
+ as: :json
235
+ )
236
+ expect(response).to have_http_status(:unprocessable_entity)
237
+ #todo: assert errors
238
+ end
239
+
240
+ it "creates a new comment" do
241
+ comment_count = @shared_post.comments.count
242
+ post(
243
+ api_board_post_comments_path(@shared_board, @shared_post),
244
+ headers: auth_headers(@user),
245
+ params: valid_attributes,
246
+ as: :json
247
+ )
248
+ expect(response).to have_http_status(:ok)
249
+ expect(response.body).to match_json_schema(:comment)
250
+ expect(body_to_json('content')).to eq valid_attributes[:content]
251
+ expect(body_to_json('user/id')).to eq @user.id
252
+ expect(Comment.find_by_id(body_to_json('id'))).to eq @shared_post.comments.last
253
+ expect(@shared_post.comments.count).to eq(comment_count+1)
254
+ end
255
+
256
+ end
257
+
258
+ context "As another user" do
259
+
260
+ it "returns http unprocessable_entity" do
261
+ post(
262
+ api_board_post_comments_path(@shared_board, @shared_post),
263
+ headers: auth_headers(@user_2),
264
+ params: invalid_attributes,
265
+ as: :json
266
+ )
267
+ expect(response).to have_http_status(:unprocessable_entity)
268
+ # todo: assert errors
269
+ end
270
+
271
+ it "creates a new comment" do
272
+ comment_count = @shared_post.comments.count
273
+ post(
274
+ api_board_post_comments_path(@shared_board, @shared_post),
275
+ headers: auth_headers(@user_2),
276
+ params: valid_attributes,
277
+ as: :json
278
+ )
279
+ expect(response).to have_http_status(:ok)
280
+ expect(response.body).to match_json_schema(:comment)
281
+ expect(body_to_json('content')).to eq valid_attributes[:content]
282
+ expect(body_to_json('user/id')).to eq @user_2.id
283
+ expect(Comment.find_by_id(body_to_json('id'))).to eq @shared_post.comments.last
284
+ expect(@shared_post.comments.count).to eq(comment_count+1)
285
+ end
286
+
287
+ end
288
+
289
+ end
290
+
291
+ describe "Updating my comment" do
292
+
293
+ context "As comment owner" do
294
+ it "updates my comment if user is me" do
295
+ put(
296
+ api_board_post_comment_path(@shared_board, @shared_post, @shared_comment),
297
+ params: valid_attributes,
298
+ headers: auth_headers(@user),
299
+ as: :json
300
+ )
301
+ expect(response).to have_http_status(:ok)
302
+ expect(body_to_json('content')).to eq(valid_attributes[:content])
303
+ expect(@shared_comment.reload.content).to eq valid_attributes[:content]
304
+ end
305
+ end
306
+
307
+ context "As another user" do
308
+
309
+ it "returns http forbidden if not comment owner" do
310
+ put(
311
+ api_board_post_comment_path(@shared_board, @shared_post, @shared_comment),
312
+ params: valid_attributes,
313
+ headers: auth_headers(@user_2),
314
+ as: :json
315
+ )
316
+ expect(response).to have_http_status(:forbidden)
317
+ end
318
+ end
319
+ end
320
+
321
+ describe "Deleting my comment on my post" do
322
+
323
+ context "As comment owner" do
324
+
325
+ it "Deletes my comment if user is me" do
326
+ prev_comment_count = @shared_post.comments.count
327
+ delete(
328
+ api_board_post_comment_path(@shared_board, @shared_post, @shared_comment),
329
+ headers: auth_headers(@user),
330
+ )
331
+ expect(response).to have_http_status(:ok)
332
+ expect(@shared_post.comments.count).to eq(prev_comment_count-1)
333
+ expect(Comment.find_by_id(@shared_comment.id)).to be_nil
334
+ end
335
+
336
+ end
337
+
338
+ context "As another user" do
339
+
340
+ it "returns http forbidden if not comment owner" do
341
+ prev_comment_count = @shared_post.comments.count
342
+ delete(
343
+ api_board_post_comment_path(@shared_board, @shared_post, @shared_comment),
344
+ headers: auth_headers(@user_2),
345
+ )
346
+ expect(response).to have_http_status(:forbidden)
347
+ expect(@shared_post.comments.count).to eq(prev_comment_count)
348
+ expect(Comment.find_by_id(@shared_comment.id)).not_to be_nil
349
+ end
350
+
351
+ it "Deletes my comment if user is me" do
352
+ prev_comment_count = @shared_post.comments.count
353
+ delete(
354
+ api_board_post_comment_path(@shared_board, @shared_post, @shared_comment),
355
+ headers: auth_headers(@user),
356
+ )
357
+ expect(response).to have_http_status(:ok)
358
+ expect(@shared_post.comments.count).to eq(prev_comment_count-1)
359
+ expect(Comment.find_by_id(@shared_comment.id)).to be_nil
360
+ end
361
+
362
+ end
363
+
364
+ end
365
+
366
+ end
367
+
368
+ end
369
+
370
+ end
@@ -0,0 +1,19 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe "WebBaseController", type: :request do
4
+
5
+ describe 'catch html5 pushState routes' do
6
+
7
+ def self.visit_app_urls(urls)
8
+ urls.each do |url|
9
+ it "renders app/index.html when visiting #{url}" do
10
+ get "/#{url}"
11
+ expect(response.body).to match File.read(Rails.public_path.join("app","index.html"))
12
+ end
13
+ end
14
+ end
15
+
16
+ visit_app_urls(['/app', 'app/', 'app/*anything'])
17
+
18
+ end
19
+ end
@@ -0,0 +1,39 @@
1
+ {
2
+ "type": "object",
3
+ "required": [
4
+ "board",
5
+ "id",
6
+ "is_admin",
7
+ "encrypted_password",
8
+ "created_at",
9
+ "updated_at"
10
+ ],
11
+ "properties": {
12
+ "board": {
13
+ "type": "object",
14
+ "required": [
15
+ "name"
16
+ ],
17
+ "properties": {
18
+ "name": {
19
+ "type": "string"
20
+ }
21
+ }
22
+ },
23
+ "id": {
24
+ "type": "integer"
25
+ },
26
+ "is_admin": {
27
+ "type": "boolean"
28
+ },
29
+ "encrypted_password": {
30
+ "type": "string|nil"
31
+ },
32
+ "created_at": {
33
+ "type": "string"
34
+ },
35
+ "updated_at": {
36
+ "type": "string"
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "type": "object",
3
+ "required": [
4
+ "id",
5
+ "content",
6
+ "user",
7
+ "created_at",
8
+ "updated_at"
9
+ ],
10
+ "properties": {
11
+ "id": {
12
+ "type": "integer"
13
+ },
14
+ "content": {
15
+ "type": "string"
16
+ },
17
+ "created_at": {
18
+ "type": "string"
19
+ },
20
+ "updated_at": {
21
+ "type": "string"
22
+ },
23
+ "user": {
24
+ "type": "object",
25
+ "requires": [
26
+ "id",
27
+ "name",
28
+ "email",
29
+ "created_at",
30
+ "updated_at"
31
+ ],
32
+ "properties": {
33
+ "id": {
34
+ "type": "integer"
35
+ },
36
+ "name": {
37
+ "type": "string"
38
+ },
39
+ "email": {
40
+ "type": "string"
41
+ },
42
+ "created_at": {
43
+ "type": "string"
44
+ },
45
+ "updated_at": {
46
+ "type": "string"
47
+ }
48
+ }
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,87 @@
1
+ {
2
+ "type": "object",
3
+ "required": [
4
+ "id",
5
+ "title",
6
+ "content",
7
+ "user",
8
+ "board",
9
+ "created_at",
10
+ "updated_at"
11
+ ],
12
+ "properties": {
13
+ "id": {
14
+ "type": "integer"
15
+ },
16
+ "title": {
17
+ "type": "string"
18
+ },
19
+ "content": {
20
+ "type": "string"
21
+ },
22
+ "created_at": {
23
+ "type": "string"
24
+ },
25
+ "updated_at": {
26
+ "type": "string"
27
+ },
28
+ "user": {
29
+ "type": "object",
30
+ "requires": [
31
+ "id",
32
+ "name",
33
+ "email",
34
+ "created_at",
35
+ "updated_at"
36
+ ],
37
+ "properties": {
38
+ "id": {
39
+ "type": "integer"
40
+ },
41
+ "name": {
42
+ "type": "string"
43
+ },
44
+ "email": {
45
+ "type": "string"
46
+ },
47
+ "created_at": {
48
+ "type": "string"
49
+ },
50
+ "updated_at": {
51
+ "type": "string"
52
+ }
53
+ }
54
+ },
55
+ "board": {
56
+ "type": "object",
57
+ "required": [
58
+ "id",
59
+ "is_admin",
60
+ "name",
61
+ "encrypted_password",
62
+ "created_at",
63
+ "updated_at"
64
+ ],
65
+ "properties": {
66
+ "id": {
67
+ "type": "integer"
68
+ },
69
+ "is_admin": {
70
+ "type": "boolean"
71
+ },
72
+ "name": {
73
+ "type": "string"
74
+ },
75
+ "encrypted_password": {
76
+ "type": "string|nil"
77
+ },
78
+ "created_at": {
79
+ "type": "string"
80
+ },
81
+ "updated_at": {
82
+ "type": "string"
83
+ }
84
+ }
85
+ }
86
+ }
87
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "type": "object",
3
+ "requires": [
4
+ "id",
5
+ "name",
6
+ "email",
7
+ "created_at",
8
+ "updated_at"
9
+ ],
10
+ "properties": {
11
+ "id": {
12
+ "type": "integer"
13
+ },
14
+ "name": {
15
+ "type": "string"
16
+ },
17
+ "email": {
18
+ "type": "string"
19
+ },
20
+ "created_at": {
21
+ "type": "string"
22
+ },
23
+ "updated_at": {
24
+ "type": "string"
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,67 @@
1
+ ENV['RAILS_ENV'] ||= 'test'
2
+
3
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
4
+ require 'rspec/rails'
5
+ # require 'rspec/autorun'
6
+ require 'byebug'
7
+ require 'rb-readline'
8
+ require 'factory_girl_rails'
9
+ require 'json_spec'
10
+ require 'json-schema-rspec'
11
+ require 'faker'
12
+ require 'database_cleaner'
13
+
14
+ Rails.backtrace_cleaner.remove_silencers!
15
+
16
+ # Load support files
17
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
18
+ Dir["#{File.dirname(__FILE__)}/concerns/**/*.rb"].each { |f| require f }
19
+
20
+ RSpec.configure do |config|
21
+
22
+ config.mock_with :rspec
23
+ config.use_transactional_fixtures = true
24
+ config.infer_base_class_for_anonymous_controllers = false
25
+ # config.order = "random"
26
+
27
+ config.include JsonSpec::Helpers
28
+ config.include FactoryGirl::Syntax::Methods
29
+
30
+
31
+ RSpec.configure do |config|
32
+ config.include JSON::SchemaMatchers
33
+ config.json_schemas[:user] = "spec/schema/user.json"
34
+ config.json_schemas[:board] = "spec/schema/board.json"
35
+ config.json_schemas[:post] = "spec/schema/post.json"
36
+ config.json_schemas[:comment] = "spec/schema/comment.json"
37
+ end
38
+
39
+
40
+ # http://stackoverflow.com/questions/5608203/rspec-integration-test-not-cleaning-the-database
41
+ # http://stackoverflow.com/questions/29466868/rspec-how-to-clean-the-database-after-each-test
42
+
43
+ RSpec.configure do |config|
44
+ config.before(:suite) do
45
+ DatabaseCleaner.clean_with(:truncation)
46
+ end
47
+
48
+ config.before(:each) do
49
+ DatabaseCleaner.strategy = :transaction
50
+ end
51
+
52
+ # config.before(:each, :js => true) do
53
+ # DatabaseCleaner.strategy = :truncation
54
+ # end
55
+
56
+ config.before(:each) do
57
+ DatabaseCleaner.start
58
+ end
59
+
60
+ config.after(:each) do
61
+ DatabaseCleaner.clean
62
+ end
63
+
64
+ end
65
+
66
+
67
+ end
@@ -0,0 +1,17 @@
1
+
2
+ module AuthHelper
3
+
4
+ def auth_headers(user)
5
+ # debugger
6
+ token = Knock::AuthToken.new(payload: { sub: user.id }).token
7
+
8
+ {
9
+ 'Authorization': "Bearer #{token}"
10
+ }
11
+ end
12
+
13
+ end
14
+
15
+ RSpec.configure do |config|
16
+ config.include AuthHelper
17
+ end