appmap 0.42.1 → 0.43.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c70b96dcf283fa03ea3acc787a78ecf3a732a78808834ba0acf09d4e398172c6
4
- data.tar.gz: ec83f4e0eb8908e971bc67e27696e5b37252289a50b848b85bd54e56520d3a75
3
+ metadata.gz: 4007f0eb67a3a25088e8b3677de8d0388fd1bfec4b326c43a51c503f640325b5
4
+ data.tar.gz: 1b593251a7a072b7a1483e7af172b9157d6913208658fb324630bc52b0b4fe73
5
5
  SHA512:
6
- metadata.gz: 1e19e607c94eee4cfebf6646f1802e27446330807a1dd252bbd94d823def31ed9abf59668f3d0672a6bfac9261e076338fe13d27a0dbea81e83da80ff726cf7c
7
- data.tar.gz: 3221cdfb7c164efecbe022f89829c4e80568b3fa5a7343c2850c8e1d4387f807e5ebcba0d04345bd5641ab3ee9a32d92faba3337dfe5f4bbe5f254fd9320d4a4
6
+ metadata.gz: 6af64a17bf69655ae8bdc9b4b67b7e2c9bd1b87d07a23e266dcabd2a927311224a4b27a77355674559828a08ae1df2e7231e2a68a2734c0f620de8efc48ec6d4
7
+ data.tar.gz: 7725cb0c79d8be13fddf7a3b688113f4fd31941c4f08f64ee44d4fbb3f5255dd3a308b08ef578413938052ee3b9eeecedc3e58bc092b12e23bfa872eac119eb7
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # v0.43.0
2
+
3
+ * Record `name` and `class` of each entry in Hash-like parameters, messages, and return values.
4
+ * Record client-sent headers in HTTP server request and response.
5
+ * Record HTTP server request `mime_type`.
6
+ * Record HTTP server request `authorization`.
7
+
1
8
  # v0.42.1
2
9
 
3
10
  * Add missing require `set`.
data/README.md CHANGED
@@ -369,7 +369,7 @@ The fixture apps in `test/fixtures` are plain Ruby projects that exercise the ba
369
369
 
370
370
  ### `spec/fixtures`
371
371
 
372
- The fixture apps in `spec/fixtures` are simple Rack, Rails4, and Rails5 apps.
372
+ The fixture apps in `spec/fixtures` are simple Rack, Rails5, and Rails6 apps.
373
373
  You can use them to interactively develop and test the recording features of the `appmap` gem.
374
374
  These fixture apps are more sophisticated than `test/fixtures`, because they include additional
375
375
  resources such as a PostgreSQL database.
@@ -395,11 +395,15 @@ $ docker-compose run --rm app ./create_app
395
395
  Now you can start a development container.
396
396
 
397
397
  ```sh-session
398
- $ docker-compose run --rm -v $PWD/../../..:/src/appmap-ruby app bash
398
+ $ docker-compose run --rm -v $PWD:/app -v $PWD/../../..:/src/appmap-ruby app bash
399
399
  Starting rails_users_app_pg_1 ... done
400
- root@6fab5f89125f:/app# cd /src/app
400
+ root@6fab5f89125f:/app# cd /src/appmap-ruby
401
+ root@6fab5f89125f:/src/appmap-ruby# rm ext/appmap/*.so ext/appmap/*.o
402
+ root@6fab5f89125f:/src/appmap-ruby# bundle
403
+ root@6fab5f89125f:/src/appmap-ruby# bundle exec rake compile
404
+ root@6fab5f89125f:/src/appmap-ruby# cd /src/app
401
405
  root@6fab5f89125f:/src/app# bundle config local.appmap /src/appmap-ruby
402
- root@6fab5f89125f:/src/app# bundle update appmap
406
+ root@6fab5f89125f:/src/app# bundle
403
407
  ```
404
408
 
405
409
  At this point, the bundle is built with the `appmap` gem located in `/src/appmap`, which is volume-mounted from the host.
@@ -414,4 +418,3 @@ Configuring AppMap from path appmap.yml
414
418
  Finished in 0.07357 seconds (files took 2.1 seconds to load)
415
419
  4 examples, 0 failures
416
420
  ```
417
-
data/lib/appmap/event.rb CHANGED
@@ -36,6 +36,18 @@ module AppMap
36
36
  (value_string||'')[0...LIMIT].encode('utf-8', invalid: :replace, undef: :replace, replace: '_')
37
37
  end
38
38
 
39
+ def object_properties(hash_like)
40
+ hash = hash_like.to_h
41
+ hash.keys.map do |key|
42
+ {
43
+ name: key,
44
+ class: hash[key].class.name,
45
+ }
46
+ end
47
+ rescue
48
+ nil
49
+ end
50
+
39
51
  protected
40
52
 
41
53
  # Heuristic for dynamically defined class whose name can be nil
@@ -79,6 +91,12 @@ module AppMap
79
91
  end
80
92
  end
81
93
  end
94
+
95
+ protected
96
+
97
+ def object_properties(hash_like)
98
+ self.class.object_properties(hash_like)
99
+ end
82
100
  end
83
101
 
84
102
  class MethodCall < MethodEvent
@@ -6,15 +6,38 @@ require 'appmap/hook'
6
6
  module AppMap
7
7
  module Rails
8
8
  module RequestHandler
9
+ # Host and User-Agent will just introduce needless variation.
10
+ # Content-Type and Authorization get their own fields in the request.
11
+ IGNORE_HEADERS = %w[host user_agent content_type authorization].map(&:upcase).map {|h| "HTTP_#{h}"}.freeze
12
+
13
+ class << self
14
+ def selected_headers(env)
15
+ # Rack prepends HTTP_ to all client-sent headers.
16
+ matching_headers = env
17
+ .select { |k,v| k.start_with? 'HTTP_'}
18
+ .reject { |k,v| IGNORE_HEADERS.member?(k) }
19
+ .reject { |k,v| v.blank? }
20
+ .each_with_object({}) do |kv, memo|
21
+ key = kv[0].sub(/^HTTP_/, '').split('_').map(&:capitalize).join('-')
22
+ value = kv[1]
23
+ memo[key] = value
24
+ end
25
+ matching_headers.blank? ? nil : matching_headers
26
+ end
27
+ end
28
+
9
29
  class HTTPServerRequest < AppMap::Event::MethodEvent
10
- attr_accessor :normalized_path_info, :request_method, :path_info, :params
30
+ attr_accessor :normalized_path_info, :request_method, :path_info, :params, :mime_type, :headers, :authorization
11
31
 
12
32
  def initialize(request)
13
33
  super AppMap::Event.next_id_counter, :call, Thread.current.object_id
14
34
 
15
- @request_method = request.request_method
16
- @normalized_path_info = normalized_path request
17
- @path_info = request.path_info.split('?')[0]
35
+ self.request_method = request.request_method
36
+ self.normalized_path_info = normalized_path(request)
37
+ self.mime_type = request.headers['Content-Type']
38
+ self.headers = RequestHandler.selected_headers(request.env)
39
+ self.authorization = request.headers['Authorization']
40
+ self.path_info = request.path_info.split('?')[0]
18
41
  # ActionDispatch::Http::ParameterFilter is deprecated
19
42
  parameter_filter_cls = \
20
43
  if defined?(ActiveSupport::ParameterFilter)
@@ -22,7 +45,7 @@ module AppMap
22
45
  else
23
46
  ActionDispatch::Http::ParameterFilter
24
47
  end
25
- @params = parameter_filter_cls.new(::Rails.application.config.filter_parameters).filter(request.params)
48
+ self.params = parameter_filter_cls.new(::Rails.application.config.filter_parameters).filter(request.params)
26
49
  end
27
50
 
28
51
  def to_h
@@ -30,7 +53,10 @@ module AppMap
30
53
  h[:http_server_request] = {
31
54
  request_method: request_method,
32
55
  path_info: path_info,
33
- normalized_path_info: normalized_path_info
56
+ mime_type: mime_type,
57
+ normalized_path_info: normalized_path_info,
58
+ authorization: authorization,
59
+ headers: headers,
34
60
  }.compact
35
61
 
36
62
  h[:message] = params.keys.map do |key|
@@ -39,8 +65,11 @@ module AppMap
39
65
  name: key,
40
66
  class: val.class.name,
41
67
  value: self.class.display_string(val),
42
- object_id: val.__id__
43
- }
68
+ object_id: val.__id__,
69
+ }.tap do |message|
70
+ properties = object_properties(val)
71
+ message[:properties] = properties if properties
72
+ end
44
73
  end
45
74
  end
46
75
  end
@@ -59,7 +88,7 @@ module AppMap
59
88
  end
60
89
 
61
90
  class HTTPServerResponse < AppMap::Event::MethodReturnIgnoreValue
62
- attr_accessor :status, :mime_type
91
+ attr_accessor :status, :mime_type, :headers
63
92
 
64
93
  def initialize(response, parent_id, elapsed)
65
94
  super AppMap::Event.next_id_counter, :return, Thread.current.object_id
@@ -68,13 +97,15 @@ module AppMap
68
97
  self.mime_type = response.headers['Content-Type']
69
98
  self.parent_id = parent_id
70
99
  self.elapsed = elapsed
100
+ self.headers = RequestHandler.selected_headers(response.headers)
71
101
  end
72
102
 
73
103
  def to_h
74
104
  super.tap do |h|
75
105
  h[:http_server_response] = {
76
106
  status: status,
77
- mime_type: mime_type
107
+ mime_type: mime_type,
108
+ headers: headers
78
109
  }.compact
79
110
  end
80
111
  end
@@ -3,7 +3,7 @@
3
3
  module AppMap
4
4
  URL = 'https://github.com/applandinc/appmap-ruby'
5
5
 
6
- VERSION = '0.42.1'
6
+ VERSION = '0.43.0'
7
7
 
8
8
  APPMAP_FORMAT_VERSION = '1.4'
9
9
  end
@@ -1,12 +1,11 @@
1
1
  require 'rails_spec_helper'
2
2
 
3
- describe 'AbstractControllerBase' do
3
+ describe 'Rails' do
4
4
  %w[5 6].each do |rails_major_version| # rubocop:disable Metrics/BlockLength
5
- context "in Rails #{rails_major_version}" do
6
- include_context 'Rails app pg database', "spec/fixtures/rails#{rails_major_version}_users_app"
5
+ context "#{rails_major_version}" do
6
+ include_context 'Rails app pg database', "spec/fixtures/rails#{rails_major_version}_users_app" unless use_existing_data?
7
+
7
8
  def run_spec(spec_name)
8
- FileUtils.rm_rf tmpdir
9
- FileUtils.mkdir_p tmpdir
10
9
  cmd = <<~CMD.gsub "\n", ' '
11
10
  docker-compose run --rm -e RAILS_ENV=test -e APPMAP=true
12
11
  -v #{File.absolute_path tmpdir}:/app/tmp app ./bin/rspec #{spec_name}
@@ -18,12 +17,20 @@ describe 'AbstractControllerBase' do
18
17
  'tmp/spec/AbstractControllerBase'
19
18
  end
20
19
 
20
+ unless use_existing_data?
21
+ before(:all) do
22
+ FileUtils.rm_rf tmpdir
23
+ FileUtils.mkdir_p tmpdir
24
+ run_spec 'spec/controllers/users_controller_spec.rb'
25
+ run_spec 'spec/controllers/users_controller_api_spec.rb'
26
+ end
27
+ end
28
+
21
29
  let(:appmap) { JSON.parse File.read File.join tmpdir, 'appmap/rspec', appmap_json_file }
22
30
  let(:events) { appmap['events'] }
23
31
 
24
- describe 'testing with rspec' do
25
- describe 'creating a user' do
26
- before(:all) { run_spec 'spec/controllers/users_controller_api_spec.rb:8' }
32
+ describe 'an API route' do
33
+ describe 'creating an object' do
27
34
  let(:appmap_json_file) do
28
35
  'Api_UsersController_POST_api_users_with_required_parameters_creates_a_user.appmap.json'
29
36
  end
@@ -32,11 +39,12 @@ describe 'AbstractControllerBase' do
32
39
  expect(File).to exist(File.join(tmpdir, 'appmap/rspec/Inventory.appmap.json'))
33
40
  end
34
41
 
35
- it 'message fields are recorded in the appmap' do
42
+ it 'http_server_request is recorded in the appmap' do
36
43
  expect(events).to include(
37
44
  hash_including(
38
45
  'http_server_request' => hash_including(
39
46
  'request_method' => 'POST',
47
+ 'normalized_path_info' => '/api/users(.:format)',
40
48
  'path_info' => '/api/users'
41
49
  ),
42
50
  'message' => include(
@@ -53,12 +61,17 @@ describe 'AbstractControllerBase' do
53
61
  'object_id' => Integer
54
62
  )
55
63
  )
56
- ),
64
+ )
65
+ )
66
+ end
67
+
68
+ it 'http_server_response is recorded in the appmap' do
69
+ expect(events).to include(
57
70
  hash_including(
58
- 'http_server_response' => {
71
+ 'http_server_response' => hash_including(
59
72
  'status' => 201,
60
73
  'mime_type' => 'application/json; charset=utf-8'
61
- }
74
+ )
62
75
  )
63
76
  )
64
77
  end
@@ -70,7 +83,7 @@ describe 'AbstractControllerBase' do
70
83
  'defined_class' => 'Api::UsersController',
71
84
  'method_id' => 'build_user',
72
85
  'path' => 'app/controllers/api/users_controller.rb',
73
- 'lineno' => 23,
86
+ 'lineno' => Integer,
74
87
  'static' => false,
75
88
  'parameters' => include(
76
89
  'name' => 'params',
@@ -93,10 +106,47 @@ describe 'AbstractControllerBase' do
93
106
  'elapsed' => Numeric
94
107
  )
95
108
  end
109
+
110
+ context 'with an object-style message' do
111
+ let(:appmap_json_file) { 'Api_UsersController_POST_api_users_with_required_parameters_with_object-style_parameters_creates_a_user.appmap.json' }
112
+
113
+ it 'message properties are recorded in the appmap' do
114
+ expect(events).to include(
115
+ hash_including(
116
+ 'message' => include(
117
+ hash_including(
118
+ 'name' => 'user',
119
+ 'properties' => [
120
+ { 'name' => 'login', 'class' => 'String' },
121
+ { 'name' => 'password', 'class' => 'String' }
122
+ ]
123
+ )
124
+ )
125
+ )
126
+ )
127
+ end
128
+ end
96
129
  end
97
130
 
98
- describe 'showing a user' do
99
- before(:all) { run_spec 'spec/controllers/users_controller_spec.rb:22' }
131
+ describe 'listing objects' do
132
+ context 'with a custom header' do
133
+ let(:appmap_json_file) { 'Api_UsersController_GET_api_users_with_a_custom_header_lists_the_users.appmap.json' }
134
+
135
+ it 'custom header is recorded in the appmap' do
136
+ expect(events).to include(
137
+ hash_including(
138
+ 'http_server_request' => hash_including(
139
+ 'headers' => hash_including('X-Sandwich' => 'turkey')
140
+ )
141
+ )
142
+ )
143
+ end
144
+ end
145
+ end
146
+ end
147
+
148
+ describe 'a UI route' do
149
+ describe 'rendering a page' do
100
150
  let(:appmap_json_file) do
101
151
  'UsersController_GET_users_login_shows_the_user.appmap.json'
102
152
  end
@@ -112,11 +162,6 @@ describe 'AbstractControllerBase' do
112
162
  )
113
163
  )
114
164
  end
115
- end
116
-
117
- describe 'listing users' do
118
- before(:all) { run_spec 'spec/controllers/users_controller_spec.rb:11' }
119
- let(:appmap_json_file) { 'UsersController_GET_users_lists_the_users.appmap.json' }
120
165
 
121
166
  it 'records and labels view rendering' do
122
167
  expect(events).to include hash_including(
@@ -128,7 +173,7 @@ describe 'AbstractControllerBase' do
128
173
  'lineno' => Integer,
129
174
  'static' => false
130
175
  )
131
-
176
+
132
177
  expect(appmap['classMap']).to include hash_including(
133
178
  'name' => 'action_view',
134
179
  'children' => include(hash_including(
@@ -142,7 +187,7 @@ describe 'AbstractControllerBase' do
142
187
  ))
143
188
  ))
144
189
  )
145
- end
190
+ end
146
191
  end
147
192
  end
148
193
  end
@@ -39,12 +39,16 @@ group :development, :test do
39
39
  gem 'appmap', appmap_options
40
40
  gem 'cucumber-rails', require: false
41
41
  gem 'rspec-rails'
42
- # Required for Sequel, since without ActiveRecord, the Rails transactional fixture support
43
- # isn't activated.
44
- gem 'database_cleaner'
45
42
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
46
43
  gem 'pry-byebug'
47
44
  end
48
45
 
46
+ group :test do
47
+ # Require only one of these.
48
+ # 'database_cleaner' requries 'database_cleaner-active_record', so don't require it.
49
+ gem 'database_cleaner-active_record', require: false
50
+ gem 'database_cleaner-sequel', require: false
51
+ end
52
+
49
53
  group :development do
50
54
  end
@@ -6,6 +6,8 @@ module Api
6
6
  end
7
7
 
8
8
  def create
9
+ params = self.params.key?(:user) ? self.params[:user] : self.params
10
+
9
11
  @user = build_user(params.slice(:login).to_unsafe_h)
10
12
  unless @user.valid?
11
13
  error = {
@@ -4,7 +4,15 @@ class UsersController < ApplicationController
4
4
  end
5
5
 
6
6
  def show
7
- if (@user = User[login: params[:id]])
7
+ find_user = lambda do |id|
8
+ if User.respond_to?(:[])
9
+ User[login: id]
10
+ else
11
+ User.find_by_login!(id)
12
+ end
13
+ end
14
+
15
+ if (@user = find_user.(params[:id]))
8
16
  render plain: @user
9
17
  else
10
18
  render plain: 'Not found', status: 404
@@ -15,8 +15,10 @@ case orm_module
15
15
  when 'sequel'
16
16
  require 'sequel-rails'
17
17
  require 'sequel_secure_password'
18
+ require 'database_cleaner-sequel' if Rails.env.test?
18
19
  when 'activerecord'
19
20
  require 'active_record/railtie'
21
+ require 'database_cleaner-active_record' if Rails.env.test?
20
22
  end
21
23
 
22
24
  require 'appmap/railtie' if defined?(AppMap)
@@ -16,11 +16,17 @@ if [[ $? != 0 ]]; then
16
16
  exit 1
17
17
  fi
18
18
 
19
- psql -h pg -U postgres -c "create database app_development"
20
- psql -h pg -U postgres -c "create database app_test"
19
+ # Required for migrations
20
+ export ORM_MODULE=sequel
21
21
 
22
+ set +e
23
+ psql -h pg -U postgres -c "drop database if exists app_development"
24
+ psql -h pg -U postgres -c "drop database if exists app_test"
22
25
  set -e
23
26
 
27
+ psql -h pg -U postgres -c "create database app_development"
28
+ psql -h pg -U postgres -c "create database app_test"
29
+
24
30
  RAILS_ENV=development ./bin/rake db:migrate
25
31
  RAILS_ENV=test ./bin/rake db:migrate
26
32
 
@@ -8,6 +8,12 @@ RSpec.describe Api::UsersController, type: :controller do
8
8
  post :create, params: { login: 'alice', password: 'foobar' }
9
9
  expect(response.status).to eq(201)
10
10
  end
11
+ describe 'with object-style parameters' do
12
+ it 'creates a user' do
13
+ post :create, params: { user: { login: 'alice', password: 'foobar' } }
14
+ expect(response.status).to eq(201)
15
+ end
16
+ end
11
17
  end
12
18
  describe 'with a missing parameter' do
13
19
  it 'reports error 422' do
@@ -25,5 +31,12 @@ RSpec.describe Api::UsersController, type: :controller do
25
31
  users = JSON.parse(response.body)
26
32
  expect(users.map { |r| r['login'] }).to include('alice')
27
33
  end
34
+ describe 'with a custom header' do
35
+ it 'lists the users' do
36
+ request.headers['X-Sandwich'] = 'turkey'
37
+ get :index, params: {}
38
+ expect(response.status).to eq(200)
39
+ end
40
+ end
28
41
  end
29
42
  end
@@ -4,7 +4,7 @@ require 'rack/test'
4
4
  RSpec.describe UsersController, type: :controller do
5
5
  render_views
6
6
 
7
- describe 'GET /users', feature: 'Show all users' do
7
+ describe 'GET /users' do
8
8
  before do
9
9
  User.create login: 'alice'
10
10
  end
@@ -14,7 +14,7 @@ RSpec.describe UsersController, type: :controller do
14
14
  end
15
15
  end
16
16
 
17
- describe 'GET /users/:login', feature: 'Show a user' do
17
+ describe 'GET /users/:login' do
18
18
  before do
19
19
  User.create login: 'alice'
20
20
  end
@@ -45,7 +45,6 @@ RSpec.configure do |config|
45
45
  # arbitrary gems may also be filtered via:
46
46
  # config.filter_gems_from_backtrace("gem name")
47
47
 
48
-
49
48
  DatabaseCleaner.allow_remote_database_url = true
50
49
 
51
50
  config.before(:suite) do
@@ -54,13 +53,8 @@ RSpec.configure do |config|
54
53
  end
55
54
 
56
55
  config.around :each do |example|
57
- # Enable the use of 'return' from a guard
58
- -> {
59
- return example.run unless %i[model controller].member?(example.metadata[:type])
60
-
61
- DatabaseCleaner.cleaning do
62
- example.run
63
- end
64
- }.call
56
+ DatabaseCleaner.cleaning do
57
+ example.run
58
+ end
65
59
  end
66
60
  end
@@ -1,7 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
  git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
3
 
4
- # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
5
4
  gem 'rails', '~> 6'
6
5
 
7
6
  gem 'haml-rails'
@@ -40,12 +39,14 @@ group :development, :test do
40
39
  gem 'appmap', appmap_options
41
40
  gem 'cucumber-rails', require: false
42
41
  gem 'rspec-rails'
43
- # Required for Sequel, since without ActiveRecord, the Rails transactional fixture support
44
- # isn't activated.
45
- gem 'database_cleaner'
46
42
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
47
43
  gem 'pry-byebug'
48
44
  end
49
45
 
46
+ group :test do
47
+ gem 'database_cleaner-active_record', require: false
48
+ gem 'database_cleaner-sequel', require: false
49
+ end
50
+
50
51
  group :development do
51
52
  end
@@ -6,6 +6,7 @@ module Api
6
6
  end
7
7
 
8
8
  def create
9
+ params = self.params.key?(:user) ? self.params[:user] : self.params
9
10
  @user = build_user(params.slice(:login).to_unsafe_h)
10
11
  unless @user.valid?
11
12
  error = {
@@ -4,7 +4,15 @@ class UsersController < ApplicationController
4
4
  end
5
5
 
6
6
  def show
7
- if (@user = User[login: params[:id]])
7
+ find_user = lambda do |id|
8
+ if User.respond_to?(:[])
9
+ User[login: id]
10
+ else
11
+ User.find_by_login!(id)
12
+ end
13
+ end
14
+
15
+ if (@user = find_user.(params[:id]))
8
16
  render plain: @user
9
17
  else
10
18
  render plain: 'Not found', status: 404
@@ -15,8 +15,10 @@ case orm_module
15
15
  when 'sequel'
16
16
  require 'sequel-rails'
17
17
  require 'sequel_secure_password'
18
+ require 'database_cleaner-sequel' if Rails.env.test?
18
19
  when 'activerecord'
19
20
  require 'active_record/railtie'
21
+ require 'database_cleaner-active_record' if Rails.env.test?
20
22
  end
21
23
 
22
24
  require 'appmap/railtie' if defined?(AppMap)
@@ -16,11 +16,17 @@ if [[ $? != 0 ]]; then
16
16
  exit 1
17
17
  fi
18
18
 
19
- psql -h pg -U postgres -c "create database app_development"
20
- psql -h pg -U postgres -c "create database app_test"
19
+ # Required for migrations
20
+ export ORM_MODULE=sequel
21
21
 
22
+ set +e
23
+ psql -h pg -U postgres -c "drop database if exists app_development"
24
+ psql -h pg -U postgres -c "drop database if exists app_test"
22
25
  set -e
23
26
 
27
+ psql -h pg -U postgres -c "create database app_development"
28
+ psql -h pg -U postgres -c "create database app_test"
29
+
24
30
  RAILS_ENV=development ./bin/rake db:migrate
25
31
  RAILS_ENV=test ./bin/rake db:migrate
26
32
 
@@ -8,6 +8,12 @@ RSpec.describe Api::UsersController, type: :controller do
8
8
  post :create, params: { login: 'alice', password: 'foobar' }
9
9
  expect(response.status).to eq(201)
10
10
  end
11
+ describe 'with object-style parameters' do
12
+ it 'creates a user' do
13
+ post :create, params: { user: { login: 'alice', password: 'foobar' } }
14
+ expect(response.status).to eq(201)
15
+ end
16
+ end
11
17
  end
12
18
  describe 'with a missing parameter' do
13
19
  it 'reports error 422' do
@@ -25,5 +31,12 @@ RSpec.describe Api::UsersController, type: :controller do
25
31
  users = JSON.parse(response.body)
26
32
  expect(users.map { |r| r['login'] }).to include('alice')
27
33
  end
34
+ describe 'with a custom header' do
35
+ it 'lists the users' do
36
+ request.headers['X-Sandwich'] = 'turkey'
37
+ get :index, params: {}
38
+ expect(response.status).to eq(200)
39
+ end
40
+ end
28
41
  end
29
42
  end
@@ -4,7 +4,7 @@ require 'rack/test'
4
4
  RSpec.describe UsersController, type: :controller do
5
5
  render_views
6
6
 
7
- describe 'GET /users', feature: 'Show all users' do
7
+ describe 'GET /users' do
8
8
  before do
9
9
  User.create login: 'alice'
10
10
  end
@@ -14,7 +14,7 @@ RSpec.describe UsersController, type: :controller do
14
14
  end
15
15
  end
16
16
 
17
- describe 'GET /users/:login', feature: 'Show a user' do
17
+ describe 'GET /users/:login' do
18
18
  before do
19
19
  User.create login: 'alice'
20
20
  end
@@ -45,7 +45,6 @@ RSpec.configure do |config|
45
45
  # arbitrary gems may also be filtered via:
46
46
  # config.filter_gems_from_backtrace("gem name")
47
47
 
48
-
49
48
  DatabaseCleaner.allow_remote_database_url = true
50
49
 
51
50
  config.before(:suite) do
@@ -54,13 +53,8 @@ RSpec.configure do |config|
54
53
  end
55
54
 
56
55
  config.around :each do |example|
57
- # Enable the use of 'return' from a guard
58
- -> {
59
- return example.run unless %i[model controller].member?(example.metadata[:type])
60
-
61
- DatabaseCleaner.cleaning do
62
- example.run
63
- end
64
- }.call
56
+ DatabaseCleaner.cleaning do
57
+ example.run
58
+ end
65
59
  end
66
60
  end
@@ -61,7 +61,7 @@ describe 'SQL events' do
61
61
  end
62
62
 
63
63
  context 'while listing records' do
64
- let(:test_line_number) { 23 }
64
+ let(:test_line_number) { 29 }
65
65
  let(:appmap_json) { File.join(tmpdir, 'appmap/rspec/Api_UsersController_GET_api_users_lists_the_users.appmap.json') }
66
66
 
67
67
  context 'using Sequel ORM' do
data/spec/spec_helper.rb CHANGED
@@ -14,3 +14,9 @@ require 'appmap'
14
14
  RSpec.configure do |config|
15
15
  config.example_status_persistence_file_path = "tmp/rspec_failed_examples.txt"
16
16
  end
17
+
18
+ # Re-run the Rails specs without re-generating the data. This is useful for efficiently enhancing and
19
+ # debugging the test itself.
20
+ def use_existing_data?
21
+ ENV['USE_EXISTING_DATA'] == 'true'
22
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appmap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.42.1
4
+ version: 0.43.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Gilpin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-29 00:00:00.000000000 Z
11
+ date: 2021-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport