introspective_grape 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.travis.yml +35 -0
  4. data/Gemfile +15 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +103 -0
  7. data/Rakefile +26 -0
  8. data/app/assets/images/introspective_grape/.keep +0 -0
  9. data/app/assets/stylesheets/introspective_grape/.keep +0 -0
  10. data/app/controllers/.keep +0 -0
  11. data/app/helpers/.keep +0 -0
  12. data/app/mailers/.keep +0 -0
  13. data/app/models/.keep +0 -0
  14. data/app/views/.keep +0 -0
  15. data/bin/rails +12 -0
  16. data/introspective_grape.gemspec +49 -0
  17. data/lib/introspective_grape/api.rb +445 -0
  18. data/lib/introspective_grape/camel_snake.rb +71 -0
  19. data/lib/introspective_grape/version.rb +3 -0
  20. data/lib/introspective_grape.rb +4 -0
  21. data/lib/tasks/introspective_grape_tasks.rake +4 -0
  22. data/spec/dummy/Gemfile +4 -0
  23. data/spec/dummy/README.rdoc +28 -0
  24. data/spec/dummy/Rakefile +6 -0
  25. data/spec/dummy/app/api/active_record_helpers.rb +17 -0
  26. data/spec/dummy/app/api/api_helpers.rb +36 -0
  27. data/spec/dummy/app/api/dummy/chat_api.rb +108 -0
  28. data/spec/dummy/app/api/dummy/company_api.rb +8 -0
  29. data/spec/dummy/app/api/dummy/entities.rb +25 -0
  30. data/spec/dummy/app/api/dummy/location_api.rb +37 -0
  31. data/spec/dummy/app/api/dummy/project_api.rb +51 -0
  32. data/spec/dummy/app/api/dummy/role_api.rb +7 -0
  33. data/spec/dummy/app/api/dummy/sessions.rb +55 -0
  34. data/spec/dummy/app/api/dummy/user_api.rb +32 -0
  35. data/spec/dummy/app/api/dummy_api.rb +57 -0
  36. data/spec/dummy/app/api/error_handlers.rb +28 -0
  37. data/spec/dummy/app/api/permissions_helper.rb +7 -0
  38. data/spec/dummy/app/assets/images/.keep +0 -0
  39. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  40. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  41. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  42. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  43. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  44. data/spec/dummy/app/mailers/.keep +0 -0
  45. data/spec/dummy/app/models/.keep +0 -0
  46. data/spec/dummy/app/models/abstract_adapter.rb +13 -0
  47. data/spec/dummy/app/models/admin_user.rb +6 -0
  48. data/spec/dummy/app/models/chat.rb +18 -0
  49. data/spec/dummy/app/models/chat_message.rb +34 -0
  50. data/spec/dummy/app/models/chat_message_user.rb +17 -0
  51. data/spec/dummy/app/models/chat_user.rb +16 -0
  52. data/spec/dummy/app/models/company.rb +14 -0
  53. data/spec/dummy/app/models/concerns/.keep +0 -0
  54. data/spec/dummy/app/models/image.rb +21 -0
  55. data/spec/dummy/app/models/job.rb +10 -0
  56. data/spec/dummy/app/models/locatable.rb +6 -0
  57. data/spec/dummy/app/models/location.rb +26 -0
  58. data/spec/dummy/app/models/location_beacon.rb +16 -0
  59. data/spec/dummy/app/models/location_gps.rb +14 -0
  60. data/spec/dummy/app/models/project.rb +20 -0
  61. data/spec/dummy/app/models/project_job.rb +7 -0
  62. data/spec/dummy/app/models/role.rb +30 -0
  63. data/spec/dummy/app/models/super_user.rb +11 -0
  64. data/spec/dummy/app/models/team.rb +9 -0
  65. data/spec/dummy/app/models/team_user.rb +13 -0
  66. data/spec/dummy/app/models/user/chatter.rb +79 -0
  67. data/spec/dummy/app/models/user.rb +84 -0
  68. data/spec/dummy/app/models/user_location.rb +28 -0
  69. data/spec/dummy/app/models/user_project_job.rb +16 -0
  70. data/spec/dummy/app/policies/application_policy.rb +47 -0
  71. data/spec/dummy/app/policies/chat_policy.rb +22 -0
  72. data/spec/dummy/app/policies/company_policy.rb +32 -0
  73. data/spec/dummy/app/policies/location_policy.rb +29 -0
  74. data/spec/dummy/app/policies/project_policy.rb +42 -0
  75. data/spec/dummy/app/policies/role_policy.rb +33 -0
  76. data/spec/dummy/app/policies/user_location_policy.rb +12 -0
  77. data/spec/dummy/app/policies/user_policy.rb +8 -0
  78. data/spec/dummy/app/views/layouts/application.html.erb +13 -0
  79. data/spec/dummy/bin/bundle +3 -0
  80. data/spec/dummy/bin/rails +4 -0
  81. data/spec/dummy/bin/rake +4 -0
  82. data/spec/dummy/bin/setup +29 -0
  83. data/spec/dummy/config/application.rb +38 -0
  84. data/spec/dummy/config/boot.rb +6 -0
  85. data/spec/dummy/config/database.yml +23 -0
  86. data/spec/dummy/config/environment.rb +11 -0
  87. data/spec/dummy/config/environments/development.rb +41 -0
  88. data/spec/dummy/config/environments/production.rb +79 -0
  89. data/spec/dummy/config/environments/test.rb +43 -0
  90. data/spec/dummy/config/initializers/assets.rb +11 -0
  91. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  92. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  93. data/spec/dummy/config/initializers/devise.rb +262 -0
  94. data/spec/dummy/config/initializers/devise_async.rb +2 -0
  95. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  96. data/spec/dummy/config/initializers/inflections.rb +16 -0
  97. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  98. data/spec/dummy/config/initializers/paperclip.rb +13 -0
  99. data/spec/dummy/config/initializers/paperclip_adapter.rb +13 -0
  100. data/spec/dummy/config/initializers/session_store.rb +3 -0
  101. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  102. data/spec/dummy/config/locales/devise.en.yml +60 -0
  103. data/spec/dummy/config/locales/en.yml +23 -0
  104. data/spec/dummy/config/routes.rb +8 -0
  105. data/spec/dummy/config/secrets.yml +22 -0
  106. data/spec/dummy/config.ru +4 -0
  107. data/spec/dummy/db/migrate/20141002205024_devise_create_users.rb +42 -0
  108. data/spec/dummy/db/migrate/20141002211055_devise_create_admin_users.rb +48 -0
  109. data/spec/dummy/db/migrate/20141002211057_create_active_admin_comments.rb +19 -0
  110. data/spec/dummy/db/migrate/20141002220722_add_lockable_to_users.rb +8 -0
  111. data/spec/dummy/db/migrate/20150406213646_create_companies.rb +11 -0
  112. data/spec/dummy/db/migrate/20150414213154_add_user_authentication_token.rb +11 -0
  113. data/spec/dummy/db/migrate/20150415222005_create_roles.rb +12 -0
  114. data/spec/dummy/db/migrate/20150505181635_create_chats.rb +9 -0
  115. data/spec/dummy/db/migrate/20150505181636_create_chat_users.rb +11 -0
  116. data/spec/dummy/db/migrate/20150505181640_create_chat_messages.rb +11 -0
  117. data/spec/dummy/db/migrate/20150507191529_create_chat_message_users.rb +11 -0
  118. data/spec/dummy/db/migrate/20150601200526_create_locations.rb +12 -0
  119. data/spec/dummy/db/migrate/20150601200533_create_locatables.rb +10 -0
  120. data/spec/dummy/db/migrate/20150601212924_create_location_beacons.rb +15 -0
  121. data/spec/dummy/db/migrate/20150601213542_create_location_gps.rb +12 -0
  122. data/spec/dummy/db/migrate/20150609201823_create_user_locations.rb +14 -0
  123. data/spec/dummy/db/migrate/20150616205336_add_role_user_constraint.rb +9 -0
  124. data/spec/dummy/db/migrate/20150617232519_create_projects.rb +10 -0
  125. data/spec/dummy/db/migrate/20150617232521_create_jobs.rb +9 -0
  126. data/spec/dummy/db/migrate/20150617232522_create_project_jobs.rb +11 -0
  127. data/spec/dummy/db/migrate/20150623170133_create_user_project_jobs.rb +12 -0
  128. data/spec/dummy/db/migrate/20150701234929_create_teams.rb +11 -0
  129. data/spec/dummy/db/migrate/20150701234930_create_team_users.rb +11 -0
  130. data/spec/dummy/db/migrate/20150727214950_add_confirmable_to_devise.rb +11 -0
  131. data/spec/dummy/db/migrate/20150820190524_add_user_names.rb +6 -0
  132. data/spec/dummy/db/migrate/20150824215701_create_images.rb +15 -0
  133. data/spec/dummy/db/migrate/20150909225019_add_password_to_project.rb +5 -0
  134. data/spec/dummy/db/schema.rb +278 -0
  135. data/spec/dummy/lib/assets/.keep +0 -0
  136. data/spec/dummy/log/.keep +0 -0
  137. data/spec/dummy/public/404.html +67 -0
  138. data/spec/dummy/public/422.html +67 -0
  139. data/spec/dummy/public/500.html +66 -0
  140. data/spec/dummy/public/favicon.ico +0 -0
  141. data/spec/fixtures/images/avatar.jpeg +0 -0
  142. data/spec/fixtures/images/exif.jpeg +0 -0
  143. data/spec/models/chat_spec.rb +32 -0
  144. data/spec/models/image_spec.rb +14 -0
  145. data/spec/models/locatable_spec.rb +10 -0
  146. data/spec/models/project_spec.rb +17 -0
  147. data/spec/models/role_spec.rb +63 -0
  148. data/spec/models/team_spec.rb +17 -0
  149. data/spec/models/team_user_spec.rb +20 -0
  150. data/spec/models/user_location_spec.rb +35 -0
  151. data/spec/models/user_project_job_spec.rb +30 -0
  152. data/spec/models/user_spec.rb +125 -0
  153. data/spec/rails_helper.rb +23 -0
  154. data/spec/requests/chat_api_spec.rb +174 -0
  155. data/spec/requests/company_api_spec.rb +61 -0
  156. data/spec/requests/location_api_spec.rb +96 -0
  157. data/spec/requests/project_api_spec.rb +151 -0
  158. data/spec/requests/role_api_spec.rb +37 -0
  159. data/spec/requests/sessions_api_spec.rb +55 -0
  160. data/spec/requests/user_api_spec.rb +191 -0
  161. data/spec/support/blueprints.rb +103 -0
  162. data/spec/support/location_helper.rb +56 -0
  163. data/spec/support/pundit_helpers.rb +13 -0
  164. data/spec/support/request_helpers.rb +22 -0
  165. metadata +562 -0
@@ -0,0 +1,35 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe UserLocation, type: :model do
4
+ include LocationHelper
5
+ before :all do
6
+ create_test_airport
7
+ end
8
+
9
+ let(:user) { User.make! }
10
+
11
+ it "validates the detectable type" do
12
+ ul = UserLocation.new(user: user, location: Location.last, detectable: Location.last, coords: rand_coords)
13
+ ul.valid?.should == false
14
+ ul.errors[:detectable_type].should == ["is not included in the list"]
15
+ end
16
+
17
+ it "logs a user's locations by beacon" do
18
+ beacon = LocationBeacon.last
19
+ p1 = user.user_locations.build(location: beacon.location, detectable: beacon, coords: rand_coords)
20
+ user.save.should == true
21
+ p2 = user.user_locations.build(location: beacon.location, detectable: beacon, coords: rand_coords)
22
+ user.save.should == true
23
+ user.user_locations.first.should == p2
24
+ end
25
+
26
+ it "logs a user's beacon location by gps" do
27
+ gps = LocationGps.last
28
+ p1 = user.user_locations.build(location: gps.location, detectable: gps, coords: rand_coords)
29
+ user.save.should == true
30
+ p2 = user.user_locations.build(location: gps.location, detectable: gps, coords: rand_coords)
31
+ user.save.should == true
32
+ user.user_locations.first.should == p2
33
+ end
34
+
35
+ end
@@ -0,0 +1,30 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe UserProjectJob, type: :model do
4
+
5
+ it "should delegate user name" do
6
+ UserProjectJob.make.name.should_not == nil
7
+ end
8
+
9
+ it "should delegate user email" do
10
+ UserProjectJob.make.email.should_not == nil
11
+ end
12
+
13
+ it "should delegate job title" do
14
+ UserProjectJob.make.title.should_not == nil
15
+ end
16
+
17
+ it "should scope job options by project" do
18
+ ProjectJob.make!
19
+ ProjectJob.make!
20
+
21
+ p = Project.make!
22
+ j = Job.make!
23
+ p.jobs.push j
24
+ p.save
25
+ r = UserProjectJob.make!(project: p, job: j)
26
+ UserProjectJob.options_for_job(p).should == p.jobs
27
+ end
28
+
29
+
30
+ end
@@ -0,0 +1,125 @@
1
+ require 'rails_helper'
2
+ include ActionDispatch::TestProcess # -> fixture_file_upload
3
+
4
+ RSpec.describe User, type: :model do
5
+ context 'User::Chatter' do
6
+
7
+ def user(email)
8
+ User.find_by_email(email) || User.make!(email: email)
9
+ end
10
+
11
+ it "uploads an avatar to AWS" do
12
+ u = User.make
13
+ u.avatar = Image.new(file: fixture_file_upload( Rails.root+'../fixtures/images/exif.jpeg'))
14
+ u.save
15
+ u.avatar.file_processing?.should == false
16
+
17
+ #u.avatar_url.should =~ /medium\/exif.jpeg/
18
+ #u.avatar_url(:original).should =~ /original\/exif.jpeg/
19
+ #u.avatar_url(:thumb).should =~ /thumb\/exif.jpeg/
20
+ end
21
+
22
+ context "chatting" do
23
+ let(:sender) { user('sender@springshot.com') }
24
+ let(:target) { user('target1@springshot.com') }
25
+ let(:target2) { user('target2@springshot.com') }
26
+ let(:target3) { user('target3@springshot.com') }
27
+
28
+ let(:discussion) {
29
+ c = sender.chat([target,target2], 'Hey guys')
30
+ target2.reply( c, "What's up?")
31
+ c
32
+ }
33
+
34
+
35
+ before :all do
36
+ Chat.destroy_all
37
+ end
38
+
39
+ it "chatting a user returns a chat" do
40
+ c = sender.chat(target, 'a private message')
41
+ c.kind_of?(Chat).should be_truthy
42
+ end
43
+
44
+ it "a user sees that she has new messages in a discussion" do
45
+ discussion.save! # invoke create hooks on ChatMessage for ChatMessageUser
46
+ sender.new_messages?(discussion)[discussion.id].should == 1
47
+ target2.new_messages?(discussion)[discussion.id].should == 0
48
+ target.new_messages?(discussion)[discussion.id].should == 2
49
+ end
50
+
51
+ it "a user gets notifications for all new messages for all conversations" do
52
+ discussion.save!
53
+ chat2 = target.chat( [target2], "Come to E2")
54
+ target.reply( chat2, "Hurry")
55
+
56
+ target2.new_messages?[discussion.id].should == nil
57
+ target2.new_messages?[chat2.id].should == 2
58
+ end
59
+
60
+ it "a user sees her new messages" do
61
+ discussion.save!
62
+
63
+ sender.read_messages.size.should == 1
64
+ sender.read_messages[0].message.should == "What's up?"
65
+
66
+ target.read_messages.size.should == 2
67
+ target.read_messages(discussion)[0].message.should == "Hey guys"
68
+ target.read_messages(discussion)[1].message.should == "What's up?"
69
+
70
+ target2.read_messages.size.should == 0
71
+ #target2.new_messages[0].message.should == "Hey guys"
72
+ end
73
+
74
+ it "users are notified when a new user is added to the chat" do
75
+ target2.add_chatters(discussion, target3)
76
+
77
+ sender.messages.last.message.should =~ /ADDED_USER/
78
+ target.messages.last.message.should =~ /ADDED_USER/
79
+ target2.messages.last.message.should =~ /ADDED_USER/
80
+ target3.messages.last.message.should =~ /ADDED_USER/
81
+ end
82
+
83
+ it "when a user drops out should not see subsequent messages" do
84
+ discussion.active_users.size.should == 3
85
+ target.leave_chat(discussion).should == true
86
+ # and if the user has left leaving again should register as a success
87
+ target.leave_chat(discussion).should == true
88
+ discussion.active_users.size.should == 2
89
+ sender.reply(discussion, 'I never liked target anyway.')
90
+
91
+ sender.messages.last.message.should == 'I never liked target anyway.'
92
+ target2.messages.last.message.should == 'I never liked target anyway.'
93
+
94
+ target.messages.last.message.should_not == 'I never liked target anyway.'
95
+ target.messages.last.message.should =~ /DEPARTS/
96
+ end
97
+
98
+ it "a user rejoins a chat and doesn't see messages while they were gone" do
99
+ target2.leave_chat(discussion)
100
+ sender.reply(discussion, "Where'd target2 go?")
101
+ sender.add_chatters( discussion, target2)
102
+
103
+ messages = target2.messages.order('created_at').map(&:message)
104
+ messages.include?("Where'd target2 go?").should be_falsey
105
+ messages.last.should =~ /ADDED_USER/
106
+ end
107
+
108
+ it "when a user reads a message it should mark the message as read" do
109
+ discussion.save!
110
+ target.chat_message_users.unread.size.should == 2
111
+ target.mark_messages_as_read(target.messages)
112
+ target.chat_message_users.unread.size.should == 0
113
+ end
114
+
115
+ it "should cascade deletes to chat_user, messages, and read logs" do
116
+ ChatUser.where(discussion.id).size.should == 3
117
+ ChatMessage.where(discussion.id).size.should == 2
118
+ discussion.destroy
119
+ ChatUser.where(discussion.id).size.should == 0
120
+ ChatMessage.where(discussion.id).size.should == 0
121
+ end
122
+ end
123
+ end
124
+
125
+ end
@@ -0,0 +1,23 @@
1
+ ENV["RAILS_ENV"] ||= 'test'
2
+ require File.expand_path("../dummy/config/environment", __FILE__)
3
+ require 'rspec/rails'
4
+ require 'support/request_helpers'
5
+ require 'support/pundit_helpers'
6
+ Dir[Rails.root.join("../support/**/*.rb")].each { |f| require f }
7
+
8
+ #load "#{Rails.root}/db/schema.rb"
9
+ RSpec.configure do |config|
10
+ config.include Devise::TestHelpers, type: :controller
11
+ config.use_transactional_fixtures = true
12
+ config.infer_spec_type_from_file_location!
13
+ config.expect_with(:rspec) { |c| c.syntax = :should }
14
+
15
+ # load helpers for the API tests
16
+ config.include RequestHelpers, type: :request
17
+ config.before(:each, type: :request) do
18
+ # run all requests as super user, test permissions under policies
19
+ with_authentication
20
+ end
21
+
22
+ end
23
+
@@ -0,0 +1,174 @@
1
+ require "rails_helper"
2
+ describe Dummy::ChatAPI, type: :request do
3
+
4
+ before :all do
5
+ User.destroy_all
6
+ @without_authentication = true
7
+
8
+ @current_user = User.make!(email: "current_user@springshot.com")
9
+ @sender = User.make!(email: "sender@springshot.com")
10
+ @lurker = User.make!(email: "lurker@springshot.com")
11
+
12
+ @lurk = @sender.chat( @lurker, "Private conversation.")
13
+ @lurker.reply(@lurk, "the lurker has his own conversation that we don't want the current_user to see anywhere")
14
+
15
+ @pm = @sender.chat( @current_user, "Private conversation.")
16
+ @sender.reply(@pm, "I'm asking a question?")
17
+ @sender.reply(@pm, "you there?")
18
+
19
+ @chat = @sender.chat( [@lurker,@current_user], "We need to talk.")
20
+ @current_user.reply(@chat, "Is this about tough love?")
21
+ end
22
+
23
+ context "while current_user is the current user" do
24
+
25
+ before :each do
26
+ @chat.reload
27
+ Grape::Endpoint.before_each do |endpoint|
28
+ allow(endpoint).to receive(:current_user) { @current_user }
29
+ end
30
+ end
31
+
32
+ it "should return a list of a user's chats" do
33
+ get "/api/v1/chats"
34
+ response.should be_success
35
+ json.size.should == 2
36
+ json.first['creator_id'].to_i.should == @sender.id
37
+ json.first['users'].size.should == Chat.find(json.first['id']).users.size
38
+ end
39
+
40
+ context :notifications do
41
+ it "should get new chat notifications" do
42
+ get "/api/v1/chats/notifications/"
43
+ response.should be_success
44
+ json.keys.size.should == 1
45
+ json[@pm.id.to_s].should == 3
46
+ end
47
+
48
+ it "should get new chat notifications for a particular chat" do
49
+ get "/api/v1/chats/notifications/", id: @pm.id
50
+ response.should be_success
51
+ json[@pm.id.to_s].should == 3
52
+ end
53
+
54
+ it "should return 0 for non-existent chats" do
55
+ get "/api/v1/chats/notifications/", id: 0
56
+ response.should be_success
57
+ json['0'].should == 0
58
+ end
59
+ end
60
+
61
+ context :messages do
62
+
63
+ it "should get no new chat messages if user was last to reply" do
64
+ get "/api/v1/chats/messages", id: @chat.id, new: true
65
+ response.should be_success
66
+ json.size.should == 0
67
+ end
68
+
69
+ it "should get new chat messages if user recieves another reply" do
70
+ @sender.reply(@chat, "And now for something completely different.")
71
+ get "/api/v1/chats/messages", id: @chat.id, new: true
72
+ response.should be_success
73
+ json.size.should == 1
74
+ end
75
+
76
+ it "should mark all new messages from all chats as read if mark_as_read is true" do
77
+ @sender.reply(@chat, 'A new response.')
78
+ @current_user.new_messages?.keys.size.should == 2
79
+ get "/api/v1/chats/messages", new: true, mark_as_read: true
80
+ response.should be_success
81
+ json.size.should == 4
82
+ @current_user.new_messages?.keys.size.should == 0
83
+ end
84
+ end
85
+
86
+
87
+ context :users do
88
+ it "should list the users in a chat" do
89
+ get "/api/v1/chats/users", id: @chat.id
90
+ response.should be_success
91
+ json.size.should == 3
92
+ json.map{|u| u['email']}.sort.should == [ "current_user@springshot.com", "lurker@springshot.com", "sender@springshot.com" ]
93
+ end
94
+
95
+ it "should add a new user to a chat" do
96
+ new_user1 = User.make
97
+ new_user1.save!
98
+ post "/api/v1/chats/users", id: @chat.id, user_ids: new_user1.id
99
+ response.should be_success
100
+ json['status'].should == true
101
+ @chat.reload
102
+ @chat.active_users.include?(new_user1).should == true
103
+ end
104
+
105
+ it "should add new users to a chat" do
106
+ new_user1 = User.make
107
+ new_user2 = User.make
108
+ new_user1.save!
109
+ new_user2.save!
110
+ post "/api/v1/chats/users", id: @chat.id, user_ids: "#{new_user1.id},#{new_user2.id}"
111
+ response.should be_success
112
+ json['status'].should == true
113
+ @chat.reload
114
+ @chat.active_users.include?(new_user1).should == true
115
+ @chat.active_users.include?(new_user2).should == true
116
+ end
117
+
118
+ it "should be invalid to add an already active chat member to a chat" do
119
+ @chat.chat_users.size.should == 3
120
+ post "/api/v1/chats/users", id: @chat.id, user_ids: @chat.active_users.first.id
121
+ response.status.should == 400
122
+ json['error'].should == "#{@chat.active_users.first.name} is already present in this chat."
123
+ @chat.reload
124
+ @chat.chat_users.size.should == 3
125
+ end
126
+
127
+ it "should raise an error when an outsider tries to add themselves to a chat" do
128
+ post "/api/v1/chats/users", id: @lurk.id, user_ids: @current_user.id
129
+ response.status.should == 400
130
+ json['error'].should == 'Only current chat participants can add users.'
131
+ @lurk.reload
132
+ @lurk.active_users.include?(@current_user).should == false
133
+ end
134
+
135
+ end
136
+
137
+ context :chat do
138
+ it "should start a new chat" do
139
+ post "/api/v1/chats", user_ids:@lurker.id, message: 'a new chat'
140
+ response.should be_success
141
+ json['creator_id'].should == @current_user.id
142
+ Chat.last.creator.should == @current_user
143
+ Chat.last.messages.map(&:message).first.should == 'a new chat'
144
+ @lurker.read_messages(Chat.last.id ).last.message.should == 'a new chat'
145
+ end
146
+
147
+ it "should reply to a chat" do
148
+ put "/api/v1/chats/#{@chat.id}", message: 'A reply.'
149
+ response.should be_success
150
+ ChatMessage.last.author.should == @current_user
151
+ @sender.read_messages(Chat.last.id ).last.message.should == 'A reply.'
152
+ @lurker.read_messages(Chat.last.id ).last.message.should == 'A reply.'
153
+ end
154
+
155
+ it "should leave a chat" do
156
+ delete "/api/v1/chats/#{@chat.id}"
157
+ response.should be_success
158
+ json['status'].should == true
159
+ @chat.reload
160
+ @chat.active_users.include?(@current_user).should == false
161
+ end
162
+
163
+ it "should only allow chat participants to reply" do
164
+ @current_user.leave_chat(@chat)
165
+ @current_user.reload
166
+ put "/api/v1/chats/#{@chat.id}", message: "I'm an interloper"
167
+ response.status.should == 400
168
+ json['error'].should == 'Messages: is invalid'
169
+ @chat.messages.last.should_not == "I'm an interloper"
170
+ end
171
+ end
172
+ end
173
+
174
+ end
@@ -0,0 +1,61 @@
1
+ require 'rails_helper'
2
+
3
+ describe Dummy::CompanyAPI, type: :request do
4
+ before :all do
5
+ Company.find_by_name("Sprockets") || Company.make!(name:"Sprockets")
6
+ end
7
+
8
+ let(:company) { Company.find_by_name("Sprockets") }
9
+
10
+ it "should return a list of companies" do
11
+ get '/api/v1/companies'
12
+ response.should be_success
13
+ json.length.should > 0
14
+ json.map{|c| c['id'].to_i}.include?(company.id).should == true
15
+ end
16
+
17
+ it "should return the specified company" do
18
+ get "/api/v1/companies/#{company.id}"
19
+ response.should be_success
20
+ json['name'].should == company.name
21
+ end
22
+
23
+ it "should return an error if the company doesn't exist" do
24
+ get "/api/v1/companies/#{Company.last.id+1}"
25
+ response.code.should == "404"
26
+ end
27
+
28
+
29
+ it "should create a company" do
30
+ post "/api/v1/companies", { name: 'Test 123', short_name: 'T123' }
31
+ response.should be_success
32
+ json['name'].should == "Test 123"
33
+ json['short_name'].should == "T123"
34
+ end
35
+
36
+ it "should validate a new company" do
37
+ post "/api/v1/companies", { name: 'a'*257, short_name: 'a'*11 }
38
+ response.code.should == "400"
39
+ json['error'].should == "Name: is too long (maximum is 256 characters), Short Name: is too long (maximum is 10 characters)"
40
+ end
41
+
42
+
43
+ it "should update the company" do
44
+ new_name = 'New Test 1234'
45
+ put "/api/v1/companies/#{company.id}", { name: new_name }
46
+ response.should be_success
47
+ company.reload
48
+ company.name.should == new_name
49
+ json['name'].should == new_name
50
+ end
51
+
52
+ it "should validate the company on update" do
53
+ old_name = company.name
54
+ put "/api/v1/companies/#{company.id}", { name: 'a'*257, short_name: 'a'*11 }
55
+ response.code.should == "400"
56
+ company.reload
57
+ company.name.should == old_name
58
+ json['error'].should == "Name: is too long (maximum is 256 characters), Short Name: is too long (maximum is 10 characters)"
59
+ end
60
+
61
+ end
@@ -0,0 +1,96 @@
1
+ require 'rails_helper'
2
+
3
+ describe Dummy::LocationAPI, type: :request do
4
+ include LocationHelper
5
+
6
+ let(:location) { Location.find_by_name("TEST") }
7
+
8
+ before :all do
9
+ create_test_airport
10
+ end
11
+
12
+ it "should return a list of top level locations and their children" do
13
+ get '/api/v1/locations'
14
+ response.should be_success
15
+ json.length.should > 0
16
+ json.map{|l| l['id'].to_i }.include?(location.id).should == true
17
+
18
+ json.first['child_locations'].size.should > 0
19
+ json.first['child_locations'].map{|l| l['id'].to_i}.sort.should == location.child_locations.map(&:id).sort
20
+ end
21
+
22
+ it "should return the specified location" do
23
+ get "/api/v1/locations/#{location.id}"
24
+ response.should be_success
25
+ json['name'].should == location.name
26
+ end
27
+
28
+ it "should return an error if the location doesn't exist" do
29
+ get "/api/v1/locations/#{Location.last.id+1}"
30
+ response.code.should == "404"
31
+ end
32
+
33
+ it "should create a location" do
34
+ post "/api/v1/locations", { name: 'Test 123', kind: "terminal" }
35
+ response.should be_success
36
+ json['name'].should == "Test 123"
37
+ end
38
+
39
+ it "should create a location with a beacon" do
40
+ b = LocationBeacon.make(company: Company.last)
41
+ post "/api/v1/locations", { name: 'Test 123', kind: "gate", beacons_attributes: [ b.attributes ] }
42
+ response.should be_success
43
+ json['name'].should == "Test 123"
44
+ l = Location.find(json['id'])
45
+ created = l.beacons.first
46
+ created.uuid.should == b.uuid.gsub(/-/,'').upcase
47
+ created.minor.should == b.minor
48
+ created.major.should == b.major
49
+ end
50
+
51
+ it "should create a location with gps coordinates" do
52
+ gps = LocationGps.make
53
+ post "/api/v1/locations", { name: 'Test 123', kind: "airport", gps_attributes: gps.attributes }
54
+ response.should be_success
55
+ json['name'].should == "Test 123"
56
+ l = Location.find(json['id'])
57
+ created = l.gps
58
+ # Ruby and Postgres do not share the same floating point precision
59
+ created.lat.round(10).should == gps.lat.round(10)
60
+ created.lng.round(10).should == gps.lng.round(10)
61
+ created.alt.should == gps.alt
62
+ end
63
+
64
+ it "should validate a new location" do
65
+ post "/api/v1/locations", { name: 'test' }
66
+ response.code.should == "400"
67
+ json['error'].should == "Kind: is not included in the list"
68
+ end
69
+
70
+ it "should update the location" do
71
+ new_name = 'New Test 1234'
72
+ put "/api/v1/locations/#{location.id}", { name: new_name }
73
+ response.should be_success
74
+ location.reload
75
+ location.name.should == new_name
76
+ json['name'].should == new_name
77
+ end
78
+
79
+ it "should validate the location on update" do
80
+ old_kind = location.kind
81
+ put "/api/v1/locations/#{location.id}", { kind: 'bring the noise' }
82
+ response.code.should == "400"
83
+ location.reload
84
+ location.kind.should == old_kind
85
+ json['error'].should == 'Kind: is not included in the list'
86
+ end
87
+
88
+ it "should destroy the location and all of its child and grandchild locations" do
89
+ child_locations = location.child_locations.map {|l| [l.id, l.child_locations.map(&:id)] }.flatten
90
+ delete "/api/v1/locations/#{location.id}"
91
+ response.should be_success
92
+ Location.find_by_id(location.id).should == nil
93
+ Location.where(id: child_locations).size.should == 0
94
+ end
95
+
96
+ end