vault-tools 0.7.1 → 2.0.2

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.
@@ -2,8 +2,9 @@ module Vault
2
2
  # The StatementStore knows how to save and retrieve invoices from S3
3
3
  class StatementStore
4
4
  def initialize(opts = {})
5
- @key_id = opts.fetch(:key_id, ENV['AWS_ACCESS_KEY_ID'])
6
- @key = opts.fetch(:key, ENV['AWS_SECRET_ACCESS_KEY'])
5
+ @credentials = Aws::Credentials.new(opts.fetch(:key_id, Config[:aws_access_key_id]),
6
+ opts.fetch(:key, Config[:aws_secret_access_key]))
7
+ @region = opts.fetch(:region, Config[:aws_region])
7
8
  end
8
9
 
9
10
  # Retrieve invoice JSON from S3
@@ -34,20 +35,24 @@ module Vault
34
35
 
35
36
  # Retrieve the contents in a given format of a given file from S3
36
37
  def retrieve(format, opts)
37
- s3.buckets[bucket_for(format, opts)].objects[path_for(opts)].read
38
+ s3.get_object({
39
+ bucket: bucket_for(format, opts),
40
+ key: path_for(opts)
41
+ }).body.read
38
42
  end
39
43
 
40
44
  # Write the contents in the given format to S3
41
45
  def write(format, opts)
42
- obj = s3.buckets[bucket_for(format, opts)].objects[path_for(opts)]
43
- obj.write(opts[:contents])
44
- obj
46
+ s3.put_object({
47
+ bucket: bucket_for(format, opts),
48
+ key: path_for(opts),
49
+ body: opts[:contents]
50
+ })
45
51
  end
46
52
 
47
53
  # Get an instance of the S3 client to work with
48
54
  def s3
49
- @s3 ||= AWS::S3.new(access_key_id: @key_id, secret_access_key: @key,
50
- use_ssl: true)
55
+ @s3 ||= Aws::S3::Client.new(credentials: @credentials, region: @region)
51
56
  end
52
57
 
53
58
  # Determine which bucket an invoice should live in
@@ -73,10 +78,11 @@ module Vault
73
78
  private
74
79
 
75
80
  def validate_path_opts(opts)
81
+ user = opts[:user_hid] || opts[:user_id]
82
+
76
83
  fail(ArgumentError, 'start_time required!') unless opts[:start_time]
77
84
  fail(ArgumentError, 'stop_time required!') unless opts[:stop_time]
78
85
  fail(ArgumentError, 'version required!') unless opts[:version]
79
- user = opts[:user_hid] || opts[:user_id]
80
86
  fail(ArgumentError, 'user_hid or or user_id required!') unless user
81
87
  end
82
88
  end
@@ -16,7 +16,7 @@ class Time
16
16
  end
17
17
  end
18
18
 
19
- class Fixnum
19
+ class Integer
20
20
  def weeks
21
21
  self.days * 7
22
22
  end
@@ -5,7 +5,7 @@ module Vault
5
5
  ID_CAPTURE = /^user(\d+)\@[\w\.]+com$/
6
6
  # Convert a user ID into a Heroku user ID.
7
7
  #
8
- # @param user_id [Fixnum] A user ID.
8
+ # @param user_id [Integer] A user ID.
9
9
  # @return [String] A Heroku ID that uniquely represents the user.
10
10
  def self.id_to_hid(user_id)
11
11
  "user#{user_id}@heroku.com"
@@ -13,7 +13,7 @@ module Vault
13
13
 
14
14
  # Convert a user ID into a v5 UUID.
15
15
  #
16
- # @param user_id [Fixnum] A user ID.
16
+ # @param user_id [Integer] A user ID.
17
17
  # @return [String] A v5 UUID that uniquely represents the user.
18
18
  def self.id_to_uuid(user_id)
19
19
  url = "https://vault.heroku.com/users/#{user_id}"
@@ -25,7 +25,7 @@ module Vault
25
25
  # @param heroku_id [String] A Heroku user ID, such as
26
26
  # `user1234@heroku.com`.
27
27
  # @raise [ArgumentError] Raised if a malformed Heroku ID is provided.
28
- # @return [Fixnum] The core user ID that uniquely represents the user.
28
+ # @return [Integer] The core user ID that uniquely represents the user.
29
29
  def self.hid_to_id(heroku_id)
30
30
  if user_id = heroku_id.slice(ID_CAPTURE, 1)
31
31
  user_id.to_i
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vault
2
4
  module Tools
3
- VERSION = '0.7.1'
5
+ VERSION = '2.0.2'
4
6
  end
5
7
  end
@@ -100,11 +100,19 @@ module Vault
100
100
  # Start timing the request.
101
101
  before do
102
102
  @start_request = Time.now
103
+ # if client sends content_type: application/json which no longer works
104
+ # https://github.com/puma/puma/compare/4.3.1...4.3.5#commitcomment-39478516
105
+ #
106
+ # fixing this here so that we do not break all client users at once
107
+ if request.env["CONTENT_TYPE"].nil? && request.env["HTTP_CONTENT_TYPE"]
108
+ request.env["CONTENT_TYPE"] = request.env["HTTP_CONTENT_TYPE"]
109
+ end
103
110
  end
104
111
 
105
112
  # Log details about the request including how long it took.
106
113
  after do
107
- Log.count_status(response.status)
114
+ @action ||= 'unknown'
115
+ Log.count_status(response.status, request_path: request.path_info)
108
116
  Log.time("http.#{@action}", (Time.now - @start_request) * 1000)
109
117
  end
110
118
 
@@ -9,35 +9,6 @@ class ConfigTest < Vault::TestCase
9
9
  Config.reset!
10
10
  end
11
11
 
12
- # Config.remote_env uses the Heroku API to read config vars from
13
- # other apps.
14
- def test_remote_env
15
- api_mock = MiniTest::Mock.new
16
- api_response = OpenStruct.new(body: {'DATABASE_URL' => 'postgres:///foo'})
17
- Heroku::API.stub(:new, api_mock) do
18
- api_mock.expect(:get_config_vars, api_response, ['app'])
19
- assert_equal('postgres:///foo',
20
- Config.remote_env('app', 'DATABASE_URL'))
21
- end
22
- end
23
-
24
- # Config.remote_env uses the Heroku API to read config vars from
25
- # other apps.
26
- def test_shared_config_loads_shared_with_correct_precedence
27
- set_env('CONFIG_APP', 'vault-config')
28
- api_mock = MiniTest::Mock.new
29
- api_response = OpenStruct.new(body: {'HELLO' => 'world'})
30
- Heroku::API.stub(:new, api_mock) do
31
- api_mock.expect(:get_config_vars, api_response, ['vault-config'])
32
- assert_equal(nil, Config[:hello])
33
- Config.default(:hello, 'foo')
34
- assert_equal('foo', Config[:hello])
35
- # this is how we'll call it in the code
36
- Config.load_shared!(Config[:config_app])
37
- assert_equal('world', Config[:hello])
38
- end
39
- end
40
-
41
12
  # Config.env returns the value matching the specified environment
42
13
  # variable name.
43
14
  def test_env
@@ -55,7 +26,7 @@ class ConfigTest < Vault::TestCase
55
26
  # Config.env return nil if an unknown environment variable is
56
27
  # requested.
57
28
  def test_env_with_unknown_name
58
- assert_equal(Config.env('UNKNOWN'), nil)
29
+ assert_nil(Config.env('UNKNOWN'))
59
30
  end
60
31
 
61
32
  # Config.env! returns the value matching the specified environment
@@ -114,14 +85,14 @@ class ConfigTest < Vault::TestCase
114
85
  # variable.
115
86
  def test_app_name
116
87
  set_env 'APP_NAME', "my-app"
117
- Config.app_name.must_equal 'my-app'
88
+ assert_equal(Config.app_name, 'my-app')
118
89
  end
119
90
 
120
91
  # Config.app_deploy returns the value of the APP_DEPLOY environment
121
92
  # variable.
122
93
  def test_app_deploy
123
94
  set_env 'APP_DEPLOY', "test"
124
- Config.app_deploy.must_equal 'test'
95
+ assert_equal(Config.app_deploy, 'test')
125
96
  end
126
97
 
127
98
  # Config.port raises a RuntimeError if no `PORT` environment variable
@@ -132,7 +103,7 @@ class ConfigTest < Vault::TestCase
132
103
  end
133
104
  end
134
105
 
135
- # Config.port converts the value from the environment to a Fixnum
106
+ # Config.port converts the value from the environment to a Integer
136
107
  def test_port_convert_to_int
137
108
  set_env 'PORT', "3000"
138
109
  assert_equal(3000, Config.port)
@@ -150,14 +121,14 @@ class ConfigTest < Vault::TestCase
150
121
 
151
122
  # Config.int(VAR) returns nil or VAR as integer.
152
123
  def test_int
153
- assert_equal(nil, Config.int('FOO'))
124
+ assert_nil Config.int('FOO')
154
125
  set_env 'FOO', "3000"
155
126
  assert_equal(3000, Config.int('FOO'))
156
127
  end
157
128
 
158
129
  # Config.time returns nil or VAR as time
159
130
  def test_time
160
- assert_equal(nil, Config.time('T'))
131
+ assert_nil(Config.time('T'))
161
132
  set_env 'T', '2000'
162
133
  assert_equal(Time.utc(2000), Config.time(:t))
163
134
  set_env 'T', '2000-2'
@@ -170,7 +141,7 @@ class ConfigTest < Vault::TestCase
170
141
 
171
142
  # Config.time returns nil or VAR as URI
172
143
  def test_uri
173
- assert_equal(nil, Config.uri('URL'))
144
+ assert_nil(Config.uri('URL'))
174
145
  set_env 'URL', 'http://user:password@the-web.com/path/to/greatness?foo=bar'
175
146
  uri = Config.uri('URL')
176
147
  assert_equal('http', uri.scheme)
@@ -8,13 +8,13 @@ class DefaultsTest < Vault::TestCase
8
8
  end
9
9
 
10
10
  def test_default_when_no_value
11
- assert_equal(Config[:max_connections], nil)
11
+ assert_nil(Config[:max_connections])
12
12
  Config.default(:max_connections, 10)
13
13
  assert_equal(Config[:max_connections], 10)
14
14
  end
15
15
 
16
16
  def test_default_with_int
17
- assert_equal(Config[:max_connections], nil)
17
+ assert_nil(Config[:max_connections])
18
18
  Config.default(:max_connections, '10')
19
19
  assert_equal('10', Config[:max_connections])
20
20
  assert_equal(10, Config.int(:max_connections))
@@ -23,7 +23,7 @@ class DefaultsTest < Vault::TestCase
23
23
  end
24
24
 
25
25
  def test_default_with_time
26
- assert_equal(Config[:date], nil)
26
+ assert_nil(Config[:date])
27
27
  Config.default(:date, '2013-01-01')
28
28
  assert_equal('2013-01-01', Config[:date])
29
29
  assert_equal(Time.utc(2013), Config.time(:date))
@@ -33,7 +33,7 @@ class DefaultsTest < Vault::TestCase
33
33
  end
34
34
 
35
35
  def test_default_with_array
36
- assert_equal(Config[:array], nil)
36
+ assert_nil(Config[:array])
37
37
  Config.default(:array, '10')
38
38
  assert_equal('10', Config[:array])
39
39
  assert_equal(['10'], Config.array(:array))
@@ -1,8 +1,11 @@
1
1
  require 'vault-test-tools'
2
2
  require 'vault-tools'
3
3
  require 'rr'
4
+ require 'minitest/around/unit'
5
+ require 'pry'
4
6
 
5
7
  ENV['RACK_ENV'] = 'test'
8
+ ENV['AWS_REGION'] = 'us-east-1'
6
9
 
7
10
  module LoggedDataHelper
8
11
  def logged_data
@@ -39,69 +42,32 @@ class Vault::TestCase
39
42
  end
40
43
 
41
44
  module StubbedS3
42
- class FakeFile
43
- def initialize(contents=nil)
44
- @contents = contents
45
- end
46
-
47
- def write(contents)
48
- @contents = contents
49
- end
50
-
51
- def read
52
- @contents
53
- end
54
- end
55
-
56
- class FakeBucket
57
- def initialize
58
- @files = {}
59
- end
60
-
61
- def [](file_name)
62
- @files[file_name] ||= FakeFile.new
63
- end
64
-
65
- def write(file_name, contents)
66
- @files[file_name].write(contents)
67
- end
68
-
69
- def objects
70
- self
71
- end
72
- end
73
-
74
45
  class FakeClient
75
46
  def initialize
76
- @buckets = {}
47
+ @files = {}
77
48
  end
78
49
 
79
- def [](bucket_name)
80
- @buckets[bucket_name] ||= FakeBucket.new
50
+ def put_object(opts)
51
+ @files["#{opts[:bucket]}::#{opts[:key]}"] = opts[:body]
81
52
  end
82
53
 
83
- def buckets
84
- self
54
+ def get_object(opts)
55
+ val = @files["#{opts[:bucket]}::#{opts[:key]}"]
56
+ OpenStruct.new(body: OpenStruct.new(read: val))
85
57
  end
86
58
  end
87
59
 
88
60
  class << self
89
61
  def seed(bucket, file, contents)
90
- fake_client.buckets[bucket].objects[file].write(contents)
62
+ fake_client.put_object({bucket: bucket, key: file, body: contents})
91
63
  end
92
64
 
93
65
  def fake_client
94
66
  @client ||= FakeClient.new
95
67
  end
96
68
 
97
- def enable!(env, opts={})
98
- AWS.stub!
99
- expected_aws_args = {
100
- access_key_id: opts.fetch(:access_key_id, 'FAKE_ID'),
101
- secret_access_key: opts.fetch(:secret_access_key, 'FAKE_KEY'),
102
- use_ssl: opts.fetch(:use_ssl, true)
103
- }
104
- env.stub(AWS::S3).new(expected_aws_args) { fake_client }
69
+ def enable!(opts={}, &block)
70
+ Aws::S3::Client.stub(:new, fake_client) { yield }
105
71
  end
106
72
  end
107
73
  end
@@ -31,10 +31,11 @@ class LogTest < Vault::TestCase
31
31
 
32
32
  # Vault::Log.count_status emits metrics to measure HTTP responses.
33
33
  def test_count_status
34
- Vault::Log.count_status(201)
35
- assert_equal '1', logged_data['count#test-app.http.201']
36
- assert_equal '1', logged_data['count#test-app.http.2xx']
37
- assert_equal 'test-deploy', logged_data['source']
34
+ Vault::Log.count_status(201, request_path: '/some/request/path')
35
+ assert_equal 1, logdata['count#test-app.http.201']
36
+ assert_equal 1, logdata['count#test-app.http.2xx']
37
+ assert_equal '/some/request/path', logdata['request_path']
38
+ assert_equal 'test-deploy', logdata['source']
38
39
  end
39
40
 
40
41
  def test_measure
@@ -7,13 +7,14 @@ end
7
7
  class S3Test < Vault::TestCase
8
8
  include LoggedDataHelper
9
9
 
10
- def setup
11
- super
10
+ def around
12
11
  set_env 'APP_DEPLOY', 'test'
13
12
  set_env 'AWS_ACCESS_KEY_ID', 'fake access key id'
14
13
  set_env 'AWS_SECRET_ACCESS_KEY', 'fake secret access key'
15
- AWS.stub!
16
- @consumer = SomeS3Consumer.new
14
+ StubbedS3.enable! do
15
+ @consumer = SomeS3Consumer.new
16
+ yield
17
+ end
17
18
  end
18
19
 
19
20
  def log_output
@@ -23,33 +24,32 @@ class S3Test < Vault::TestCase
23
24
  # S3 writes should be logged.
24
25
  def test_write_logs
25
26
  @consumer.write('fake bucket', 'fake key', 'fake value')
26
- assert_match /fake key/, log_output
27
+ assert_match(/fake key/, log_output)
27
28
  end
28
29
 
29
30
  # S3 reads should be logged.
30
31
  def test_read_logs
31
32
  @consumer.read('fake bucket', 'fake key')
32
- assert_match /fake key/, log_output
33
+ assert_match(/fake key/, log_output)
33
34
  end
34
35
 
35
36
  # Should use S3 to write to bucket
36
37
  def test_writes_to_s3_bucket
37
- mock(@consumer).s3.mock!.buckets.
38
- mock!.[]('fake bucket').
39
- mock!.objects.
40
- mock!.[]('fake key').
41
- mock!.write('fake value')
38
+ mock(@consumer).s3.mock!.put_object({
39
+ bucket: 'fake bucket',
40
+ key: 'fake key',
41
+ body: 'fake value'
42
+ })
42
43
  @consumer.write('fake bucket', 'fake key', 'fake value')
43
44
  end
44
45
 
45
46
  # Should use S3 to read from bucket
46
47
  def test_reads_from_s3_bucket
47
48
  #s3.buckets[bucket].objects[key].read
48
- mock(@consumer).s3.mock!.buckets.
49
- mock!.[]('fake bucket').
50
- mock!.objects.
51
- mock!.[]('fake key').
52
- mock!.read
49
+ mock(@consumer).s3.mock!.get_object({
50
+ bucket: 'fake bucket',
51
+ key: 'fake key'
52
+ }).mock!.body.mock!.read
53
53
  @consumer.read('fake bucket', 'fake key')
54
54
  end
55
55
  end
@@ -1,12 +1,12 @@
1
1
  require 'helper'
2
2
 
3
3
  class StatementStoreTest < Vault::TestCase
4
- def setup
5
- super
6
- StubbedS3.enable!(self)
7
- StubbedS3.seed('vault-v2-json-invoice-test',
8
- '2014-10-01/2014-11-01/user8@heroku.com_v2', '{"foo": 1}')
9
-
4
+ def around(&block)
5
+ StubbedS3.enable! do
6
+ StubbedS3.seed('vault-v2-json-invoice-test',
7
+ '2014-10-01/2014-11-01/user8@heroku.com_v2', '{"foo": 1}')
8
+ yield
9
+ end
10
10
  end
11
11
 
12
12
  def test_invoice_path_with_user_id
@@ -36,15 +36,12 @@ class StatementStoreTest < Vault::TestCase
36
36
  # Nothing Before Write
37
37
  doc = inv.get_json(start_time: '2014-10-01', stop_time: '2014-11-01',
38
38
  user_hid: 'user9@heroku.com', version: 2)
39
- expected = nil
40
- assert_equal expected, doc
39
+ assert_nil doc
41
40
 
42
41
  # Write to S3 updating expectation
43
42
  expected = {"bar" => 3}
44
- obj = inv.write_json(start_time: '2014-10-01', stop_time: '2014-11-01',
45
- user_hid: 'user9@heroku.com', version: 2,
46
- contents: expected)
47
- assert obj.is_a? StubbedS3::FakeFile
43
+ inv.write_json(start_time: '2014-10-01', stop_time: '2014-11-01',
44
+ user_hid: 'user9@heroku.com', version: 2, contents: expected)
48
45
 
49
46
  # There after write
50
47
  doc = inv.get_json(start_time: '2014-10-01', stop_time: '2014-11-01',