openstax_api 8.3.1 → 9.2.0

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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -1
  3. data/app/controllers/openstax/api/v1/api_controller.rb +17 -12
  4. data/lib/openstax/api/engine.rb +2 -0
  5. data/lib/openstax/api/roar.rb +24 -19
  6. data/lib/openstax/api/rspec_helpers.rb +41 -42
  7. data/lib/openstax/api/version.rb +1 -1
  8. metadata +31 -162
  9. data/spec/controllers/openstax/api/v1/api_controller_spec.rb +0 -176
  10. data/spec/dummy/README.md +0 -1
  11. data/spec/dummy/Rakefile +0 -6
  12. data/spec/dummy/app/assets/javascripts/application.js +0 -13
  13. data/spec/dummy/app/assets/stylesheets/application.css +0 -15
  14. data/spec/dummy/app/controllers/api/v1/dummy_controller.rb +0 -23
  15. data/spec/dummy/app/helpers/application_helper.rb +0 -2
  16. data/spec/dummy/app/models/user.rb +0 -2
  17. data/spec/dummy/app/representers/user_representer.rb +0 -13
  18. data/spec/dummy/app/representers/user_search_representer.rb +0 -5
  19. data/spec/dummy/app/routines/search_users.rb +0 -42
  20. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  21. data/spec/dummy/bin/bundle +0 -3
  22. data/spec/dummy/bin/rails +0 -4
  23. data/spec/dummy/bin/rake +0 -4
  24. data/spec/dummy/config.ru +0 -4
  25. data/spec/dummy/config/application.rb +0 -23
  26. data/spec/dummy/config/boot.rb +0 -5
  27. data/spec/dummy/config/database.yml +0 -25
  28. data/spec/dummy/config/environment.rb +0 -7
  29. data/spec/dummy/config/environments/development.rb +0 -37
  30. data/spec/dummy/config/environments/production.rb +0 -78
  31. data/spec/dummy/config/environments/test.rb +0 -39
  32. data/spec/dummy/config/initializers/assets.rb +0 -8
  33. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  34. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -3
  35. data/spec/dummy/config/initializers/doorkeeper.rb +0 -75
  36. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  37. data/spec/dummy/config/initializers/inflections.rb +0 -16
  38. data/spec/dummy/config/initializers/mime_types.rb +0 -4
  39. data/spec/dummy/config/initializers/openstax_api.rb +0 -4
  40. data/spec/dummy/config/initializers/session_store.rb +0 -3
  41. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  42. data/spec/dummy/config/locales/en.yml +0 -23
  43. data/spec/dummy/config/routes.rb +0 -6
  44. data/spec/dummy/config/secrets.yml +0 -22
  45. data/spec/dummy/db/development.sqlite3 +0 -0
  46. data/spec/dummy/db/migrate/0_create_doorkeeper_tables.rb +0 -42
  47. data/spec/dummy/db/migrate/1_create_users.rb +0 -16
  48. data/spec/dummy/db/schema.rb +0 -68
  49. data/spec/dummy/db/test.sqlite3 +0 -0
  50. data/spec/dummy/lib/controller_includes.rb +0 -3
  51. data/spec/dummy/public/404.html +0 -67
  52. data/spec/dummy/public/422.html +0 -67
  53. data/spec/dummy/public/500.html +0 -66
  54. data/spec/dummy/public/favicon.ico +0 -0
  55. data/spec/factories/user.rb +0 -8
  56. data/spec/lib/openstax/api/apipie_spec.rb +0 -15
  57. data/spec/lib/openstax/api/constraints_spec.rb +0 -84
  58. data/spec/lib/openstax/api/doorkeeper_application_includes_spec.rb +0 -17
  59. data/spec/lib/openstax/api/params_spec.rb +0 -78
  60. data/spec/lib/openstax/api/representable_schema_printer_spec.rb +0 -27
  61. data/spec/lib/openstax/api/roar_spec.rb +0 -45
  62. data/spec/lib/openstax/api/routing_mapper_includes_spec.rb +0 -20
  63. data/spec/lib/openstax_api_spec.rb +0 -19
  64. data/spec/models/openstax/api/api_user_spec.rb +0 -47
  65. data/spec/rails_helper.rb +0 -54
  66. data/spec/representers/openstax/api/v1/abstract_search_representer_spec.rb +0 -144
  67. data/spec/spec_helper.rb +0 -86
@@ -1,176 +0,0 @@
1
- require 'rails_helper'
2
-
3
- module OpenStax
4
- module Api
5
- module V1
6
- describe ApiController do
7
-
8
- let!(:user) { FactoryBot.create :user }
9
- let!(:user_2) { FactoryBot.create :user }
10
- let!(:application) { double('Doorkeeper::Application') }
11
- let!(:doorkeeper_token) { double('Doorkeeper::AccessToken') }
12
- let!(:non_doorkeeper_user_proc) { lambda { user } }
13
- let!(:controller) { ApiController.new }
14
- let!(:dummy_controller) {
15
- c = ::Api::V1::DummyController.new
16
- c.response = ActionDispatch::TestResponse.new
17
- c
18
- }
19
-
20
- context 'no authentication' do
21
- before (:each) do
22
- controller.doorkeeper_token = nil
23
- controller.present_user = nil
24
- end
25
-
26
- it 'has no human_user and no application' do
27
- expect(controller.send :session_user?).to eq false
28
- expect(controller.current_application).to be_nil
29
- expect(controller.current_human_user).to be_nil
30
- expect(controller.current_session_user).to be_nil
31
- end
32
- end
33
-
34
- context 'session' do
35
- before (:each) do
36
- controller.doorkeeper_token = nil
37
- controller.present_user = user
38
- end
39
-
40
- it 'has a human_user but no application' do
41
- expect(controller.send :session_user?).to eq true
42
- expect(controller.current_application).to be_nil
43
- expect(controller.current_human_user).to eq user
44
- expect(controller.current_session_user).to eq user
45
- end
46
- end
47
-
48
- context 'token with application and human user' do
49
- before (:each) do
50
- controller.doorkeeper_token = doorkeeper_token
51
- controller.present_user = nil
52
- end
53
-
54
- it 'has a human_user from token and an application' do
55
- allow(doorkeeper_token).to receive(:application).and_return(application)
56
- allow(doorkeeper_token).to receive(:resource_owner_id).and_return(user.id)
57
-
58
- expect(controller.send :session_user?).to eq false
59
- expect(controller.current_application).to eq application
60
- expect(controller.current_human_user).to eq user
61
- expect(controller.current_session_user).to be_nil
62
- end
63
- end
64
-
65
- context 'token with application only' do
66
- before (:each) do
67
- controller.doorkeeper_token = doorkeeper_token
68
- controller.present_user = nil
69
- end
70
-
71
- it 'has an application but no human_user' do
72
- allow(doorkeeper_token).to receive(:application).and_return(application)
73
- allow(doorkeeper_token).to receive(:resource_owner_id).and_return(nil)
74
-
75
- expect(controller.send :session_user?).to eq false
76
- expect(controller.current_application).to eq application
77
- expect(controller.current_human_user).to eq nil
78
- expect(controller.current_session_user).to eq nil
79
- end
80
- end
81
-
82
- context 'session and token' do
83
- before (:each) do
84
- controller.doorkeeper_token = doorkeeper_token
85
- controller.present_user = user_2
86
- end
87
-
88
- it 'ignores the session unless explicitly asked' do
89
- allow(doorkeeper_token).to receive(:application).and_return(application)
90
- allow(doorkeeper_token).to receive(:resource_owner_id).and_return(user)
91
-
92
- expect(controller.send :session_user?).to eq false
93
- expect(controller.current_application).to eq application
94
- expect(controller.current_human_user).to eq user
95
- expect(controller.current_session_user).to eq user_2
96
- end
97
- end
98
-
99
- context 'date' do
100
- before(:each) do
101
- instance_variable_set('@controller', dummy_controller)
102
- end
103
-
104
- it 'sets the Date header for successful API calls' do
105
- @controller.present_user = user
106
- get 'dummy'
107
- expect(Time.parse(response.headers['Date'])).to be_within(1.second).of(Time.now)
108
- end
109
- end
110
-
111
- context 'cors without origin configured' do
112
- before(:each) do
113
- instance_variable_set('@controller', dummy_controller)
114
- end
115
-
116
- it 'sets the CORS headers for anonymous users' do
117
- get 'dummy'
118
- expect(response.headers['Access-Control-Allow-Origin']).to be_nil
119
- expect(response.headers['Access-Control-Allow-Credentials']).to be_nil
120
- end
121
-
122
- it 'sets the CORS headers for token users' do
123
- token = Doorkeeper::AccessToken.create!.token
124
- @request.headers['Authorization'] = "Bearer #{token}"
125
- get 'dummy'
126
- expect(response.headers['Access-Control-Allow-Origin']).to be_nil
127
- expect(response.headers['Access-Control-Allow-Credentials']).to be_nil
128
- end
129
-
130
- it 'sets the CORS headers for session users (the browser should block the request due to no Access-Control-Allow-Credentials header)' do
131
- @controller.present_user = user
132
- get 'dummy'
133
- expect(response.headers['Access-Control-Allow-Origin']).to be_nil
134
- expect(response.headers['Access-Control-Allow-Credentials']).to be_nil
135
- end
136
- end
137
-
138
- context 'cors with origin configured' do
139
- before(:each) do
140
- instance_variable_set('@controller', dummy_controller)
141
- OpenStax::Api.configuration.validate_cors_origin = lambda{ |request|
142
- request.headers["HTTP_ORIGIN"] == @valid_origin
143
- }
144
- end
145
- after(:each) { OpenStax::Api.configuration.validate_cors_origin = nil }
146
-
147
- context 'when configured proc is true' do
148
- before(:each) do
149
- @valid_origin = 'http://good-host'
150
- @request.headers['HTTP_ORIGIN'] = @valid_origin
151
- end
152
-
153
- it 'sets the origin to whatever was reqeusted' do
154
- get 'dummy'
155
- expect(response.headers['Access-Control-Allow-Origin']).to eq @valid_origin
156
- end
157
-
158
- it 'sets the origin to whatever was requested even if there was an exception raised' do
159
- get 'explode'
160
- expect(response.headers['Access-Control-Allow-Origin']).to eq @valid_origin
161
- end
162
- end
163
-
164
- it 'clears the headers if the configured proc is falsy' do
165
- @valid_origin = 'http://good-host'
166
- @request.headers['HTTP_ORIGIN'] = 'http://evil-host'
167
- get 'dummy'
168
- expect(response.headers['Access-Control-Allow-Origin']).to eq ''
169
- end
170
-
171
- end
172
-
173
- end
174
- end
175
- end
176
- end
@@ -1 +0,0 @@
1
- Dummy application used to test the openstax_api gem.
@@ -1,6 +0,0 @@
1
- # Add your own tasks in files placed in lib/tasks ending in .rake,
2
- # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
-
4
- require File.expand_path('../config/application', __FILE__)
5
-
6
- Rails.application.load_tasks
@@ -1,13 +0,0 @@
1
- // This is a manifest file that'll be compiled into application.js, which will include all the files
2
- // listed below.
3
- //
4
- // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
- // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
- //
7
- // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
- // compiled file.
9
- //
10
- // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
- // about supported directives.
12
- //
13
- //= require_tree .
@@ -1,15 +0,0 @@
1
- /*
2
- * This is a manifest file that'll be compiled into application.css, which will include all the files
3
- * listed below.
4
- *
5
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
- * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
- *
8
- * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
- * compiled file so the styles you add here take precedence over styles defined in any styles
10
- * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
- * file per style scope.
12
- *
13
- *= require_tree .
14
- *= require_self
15
- */
@@ -1,23 +0,0 @@
1
- module Api
2
- module V1
3
-
4
- class DummyControllerError < StandardError; end
5
-
6
- class DummyController < OpenStax::Api::V1::ApiController
7
-
8
- rescue_from DummyControllerError do |e|
9
- render nothing: true, status: 500
10
- end
11
-
12
- def dummy
13
- head(:ok)
14
- end
15
-
16
- def explode
17
- raise DummyControllerError, "kaboom"
18
- end
19
-
20
- end
21
-
22
- end
23
- end
@@ -1,2 +0,0 @@
1
- module ApplicationHelper
2
- end
@@ -1,2 +0,0 @@
1
- class User < ActiveRecord::Base
2
- end
@@ -1,13 +0,0 @@
1
- require 'representable/json'
2
-
3
- class UserRepresenter < Roar::Decorator
4
-
5
- include Roar::JSON
6
-
7
- property :unused, as: :username, readable: false, writeable: false,
8
- schema_info: { required: true }
9
- property :name, readable: true, writeable: true
10
- property :email, readable: false, writeable: true
11
- property :password_hash, readable: false, writeable: false
12
-
13
- end
@@ -1,5 +0,0 @@
1
- require 'representable/json'
2
-
3
- class UserSearchRepresenter < OpenStax::Api::V1::AbstractSearchRepresenter
4
- collection :items, inherit: true, class: User, decorator: UserRepresenter
5
- end
@@ -1,42 +0,0 @@
1
- # Dummy routine for testing the abstract search representer
2
-
3
- class SearchUsers
4
-
5
- lev_routine
6
-
7
- uses_routine OSU::SearchAndOrganizeRelation,
8
- as: :search,
9
- translations: { outputs: { type: :verbatim } }
10
-
11
- SORTABLE_FIELDS = {
12
- 'name' => :name,
13
- 'created_at' => :created_at
14
- }
15
-
16
- protected
17
-
18
- def exec(params = {})
19
- run(:search, relation: User.unscoped,
20
- sortable_fields: SORTABLE_FIELDS,
21
- params: params) do |with|
22
- with.keyword :username do |names|
23
- snames = to_string_array(names, append_wildcard: true)
24
- next @items = @items.none if snames.empty?
25
- @items = @items.where{username.like_any snames}
26
- end
27
-
28
- with.keyword :first_name do |names|
29
- snames = to_string_array(names, append_wildcard: true)
30
- next @items = @items.none if snames.empty?
31
- @items = @items.where{name.like_any snames}
32
- end
33
-
34
- with.keyword :last_name do |names|
35
- snames = to_string_array(names, append_wildcard: true)
36
- .collect{|name| "% #{name}"}
37
- next @items = @items.none if snames.empty?
38
- @items = @items.where{name.like_any snames}
39
- end
40
- end
41
- end
42
- end
@@ -1,14 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Dummy</title>
5
- <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
6
- <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
7
- <%= csrf_meta_tags %>
8
- </head>
9
- <body>
10
-
11
- <%= yield %>
12
-
13
- </body>
14
- </html>
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env ruby
2
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3
- load Gem.bin_path('bundler', 'bundle')
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env ruby
2
- APP_PATH = File.expand_path('../../config/application', __FILE__)
3
- require_relative '../config/boot'
4
- require 'rails/commands'
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require_relative '../config/boot'
3
- require 'rake'
4
- Rake.application.run
@@ -1,4 +0,0 @@
1
- # This file is used by Rack-based servers to start the application.
2
-
3
- require ::File.expand_path('../config/environment', __FILE__)
4
- run Rails.application
@@ -1,23 +0,0 @@
1
- require File.expand_path('../boot', __FILE__)
2
-
3
- require 'rails/all'
4
-
5
- Bundler.require(*Rails.groups)
6
- require "openstax_api"
7
-
8
- module Dummy
9
- class Application < Rails::Application
10
- # Settings in config/environments/* take precedence over those specified here.
11
- # Application configuration should go into files in config/initializers
12
- # -- all .rb files in that directory are automatically loaded.
13
-
14
- # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
15
- # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
16
- # config.time_zone = 'Central Time (US & Canada)'
17
-
18
- # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
19
- # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
20
- # config.i18n.default_locale = :de
21
- end
22
- end
23
-
@@ -1,5 +0,0 @@
1
- # Set up gems listed in the Gemfile.
2
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)
3
-
4
- require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
5
- $LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__)
@@ -1,25 +0,0 @@
1
- # SQLite version 3.x
2
- # gem install sqlite3
3
- #
4
- # Ensure the SQLite 3 gem is defined in your Gemfile
5
- # gem 'sqlite3'
6
- #
7
- default: &default
8
- adapter: sqlite3
9
- pool: 5
10
- timeout: 5000
11
-
12
- development:
13
- <<: *default
14
- database: db/development.sqlite3
15
-
16
- # Warning: The database defined as "test" will be erased and
17
- # re-generated from your development database when you run "rake".
18
- # Do not set this db to the same as development or production.
19
- test:
20
- <<: *default
21
- database: db/test.sqlite3
22
-
23
- production:
24
- <<: *default
25
- database: db/production.sqlite3
@@ -1,7 +0,0 @@
1
- # Load the Rails application.
2
- require File.expand_path('../application', __FILE__)
3
-
4
- require 'controller_includes'
5
-
6
- # Initialize the Rails application.
7
- Rails.application.initialize!
@@ -1,37 +0,0 @@
1
- Rails.application.configure do
2
- # Settings specified here will take precedence over those in config/application.rb.
3
-
4
- # In the development environment your application's code is reloaded on
5
- # every request. This slows down response time but is perfect for development
6
- # since you don't have to restart the web server when you make code changes.
7
- config.cache_classes = false
8
-
9
- # Do not eager load code on boot.
10
- config.eager_load = false
11
-
12
- # Show full error reports and disable caching.
13
- config.consider_all_requests_local = true
14
- config.action_controller.perform_caching = false
15
-
16
- # Don't care if the mailer can't send.
17
- config.action_mailer.raise_delivery_errors = false
18
-
19
- # Print deprecation notices to the Rails logger.
20
- config.active_support.deprecation = :log
21
-
22
- # Raise an error on page load if there are pending migrations.
23
- config.active_record.migration_error = :page_load
24
-
25
- # Debug mode disables concatenation and preprocessing of assets.
26
- # This option may cause significant delays in view rendering with a large
27
- # number of complex assets.
28
- config.assets.debug = true
29
-
30
- # Adds additional error checking when serving assets at runtime.
31
- # Checks for improperly declared sprockets dependencies.
32
- # Raises helpful error messages.
33
- config.assets.raise_runtime_errors = true
34
-
35
- # Raises error for missing translations
36
- # config.action_view.raise_on_missing_translations = true
37
- end