service_template 0.5.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 (105) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rubocop.yml +23 -0
  4. data/.travis.yml +13 -0
  5. data/CHANGELOG.md +64 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +24 -0
  8. data/README.md +217 -0
  9. data/Rakefile +9 -0
  10. data/bin/service_template +5 -0
  11. data/lib/service_template.rb +55 -0
  12. data/lib/service_template/active_record_extensions/notifications_subscriber.rb +17 -0
  13. data/lib/service_template/active_record_extensions/seeder.rb +14 -0
  14. data/lib/service_template/active_record_extensions/stats.rb +37 -0
  15. data/lib/service_template/authentication.rb +8 -0
  16. data/lib/service_template/cli.rb +111 -0
  17. data/lib/service_template/deploy.rb +98 -0
  18. data/lib/service_template/gem_dependency.rb +37 -0
  19. data/lib/service_template/generators.rb +3 -0
  20. data/lib/service_template/generators/api_generator.rb +30 -0
  21. data/lib/service_template/generators/readme_generator.rb +47 -0
  22. data/lib/service_template/generators/scaffold_generator.rb +29 -0
  23. data/lib/service_template/generators/templates/api/app/apis/%name_tableize%_api.rb.tt +40 -0
  24. data/lib/service_template/generators/templates/api/app/models/%name_underscore%.rb.tt +2 -0
  25. data/lib/service_template/generators/templates/api/app/representers/%name_underscore%_representer.rb.tt +4 -0
  26. data/lib/service_template/generators/templates/api/spec/apis/%name_tableize%_api_spec.rb.tt +16 -0
  27. data/lib/service_template/generators/templates/api/spec/models/%name_underscore%_spec.rb.tt +9 -0
  28. data/lib/service_template/generators/templates/readme/README.md.tt +55 -0
  29. data/lib/service_template/generators/templates/readme/spec/docs/readme_spec.rb +7 -0
  30. data/lib/service_template/generators/templates/scaffold/.env.development.tt +9 -0
  31. data/lib/service_template/generators/templates/scaffold/.env.test.tt +10 -0
  32. data/lib/service_template/generators/templates/scaffold/.gitignore.tt +13 -0
  33. data/lib/service_template/generators/templates/scaffold/.rubocop.yml +24 -0
  34. data/lib/service_template/generators/templates/scaffold/.ruby-version.tt +1 -0
  35. data/lib/service_template/generators/templates/scaffold/Gemfile.tt +29 -0
  36. data/lib/service_template/generators/templates/scaffold/README.md +3 -0
  37. data/lib/service_template/generators/templates/scaffold/Rakefile +21 -0
  38. data/lib/service_template/generators/templates/scaffold/app.rb +19 -0
  39. data/lib/service_template/generators/templates/scaffold/app/apis/application_api.rb +9 -0
  40. data/lib/service_template/generators/templates/scaffold/app/apis/hello_api.rb.tt +10 -0
  41. data/lib/service_template/generators/templates/scaffold/config.ru.tt +21 -0
  42. data/lib/service_template/generators/templates/scaffold/config/database.yml.tt +19 -0
  43. data/lib/service_template/generators/templates/scaffold/config/initializers/active_record.rb +5 -0
  44. data/lib/service_template/generators/templates/scaffold/db/schema.rb +11 -0
  45. data/lib/service_template/generators/templates/scaffold/lib/.keep +0 -0
  46. data/lib/service_template/generators/templates/scaffold/log/.keep +0 -0
  47. data/lib/service_template/generators/templates/scaffold/spec/apis/hello_api_spec.rb.tt +17 -0
  48. data/lib/service_template/generators/templates/scaffold/spec/factories/.gitkeep +0 -0
  49. data/lib/service_template/generators/templates/scaffold/spec/spec_helper.rb +47 -0
  50. data/lib/service_template/grape_extenders.rb +30 -0
  51. data/lib/service_template/grape_extensions/error_formatter.rb +18 -0
  52. data/lib/service_template/grape_extensions/grape_helpers.rb +27 -0
  53. data/lib/service_template/identity.rb +45 -0
  54. data/lib/service_template/json_error.rb +24 -0
  55. data/lib/service_template/logger/log_transaction.rb +17 -0
  56. data/lib/service_template/logger/logger.rb +42 -0
  57. data/lib/service_template/logger/parseable.rb +37 -0
  58. data/lib/service_template/middleware/app_monitor.rb +17 -0
  59. data/lib/service_template/middleware/authentication.rb +32 -0
  60. data/lib/service_template/middleware/database_stats.rb +15 -0
  61. data/lib/service_template/middleware/logger.rb +67 -0
  62. data/lib/service_template/middleware/request_stats.rb +42 -0
  63. data/lib/service_template/output_formatters/entity.rb +15 -0
  64. data/lib/service_template/output_formatters/include_nil.rb +16 -0
  65. data/lib/service_template/output_formatters/json_api_representer.rb +9 -0
  66. data/lib/service_template/param_sanitizer.rb +30 -0
  67. data/lib/service_template/rspec_extensions/response_helpers.rb +46 -0
  68. data/lib/service_template/setup.rb +36 -0
  69. data/lib/service_template/sortable_api.rb +17 -0
  70. data/lib/service_template/stats.rb +43 -0
  71. data/lib/service_template/stats_d_timer.rb +26 -0
  72. data/lib/service_template/version.rb +45 -0
  73. data/lib/tasks/deploy.rake +11 -0
  74. data/lib/tasks/routes.rake +11 -0
  75. data/service_template.gemspec +42 -0
  76. data/spec/active_record_extensions/filter_by_hash_spec.rb +23 -0
  77. data/spec/active_record_extensions/seeder_spec.rb +13 -0
  78. data/spec/authentication_spec.rb +17 -0
  79. data/spec/deprecations/application_api_spec.rb +19 -0
  80. data/spec/deprecations/entity_spec.rb +9 -0
  81. data/spec/deprecations/filter_by_hash_spec.rb +9 -0
  82. data/spec/deprecations/napa_setup_spec.rb +52 -0
  83. data/spec/generators/api_generator_spec.rb +63 -0
  84. data/spec/generators/migration_generator_spec.rb +105 -0
  85. data/spec/generators/readme_generator_spec.rb +35 -0
  86. data/spec/generators/scaffold_generator_spec.rb +90 -0
  87. data/spec/grape_extenders_spec.rb +50 -0
  88. data/spec/grape_extensions/error_formatter_spec.rb +29 -0
  89. data/spec/grape_extensions/include_nil_spec.rb +23 -0
  90. data/spec/identity_spec.rb +50 -0
  91. data/spec/json_error_spec.rb +33 -0
  92. data/spec/logger/log_transaction_spec.rb +34 -0
  93. data/spec/logger/logger_spec.rb +14 -0
  94. data/spec/logger/parseable_spec.rb +16 -0
  95. data/spec/middleware/authentication_spec.rb +54 -0
  96. data/spec/middleware/database_stats_spec.rb +64 -0
  97. data/spec/middleware/request_stats_spec.rb +21 -0
  98. data/spec/sortable_api_spec.rb +56 -0
  99. data/spec/spec_helper.rb +45 -0
  100. data/spec/stats_d_timer_spec.rb +23 -0
  101. data/spec/stats_spec.rb +66 -0
  102. data/spec/version_spec.rb +40 -0
  103. data/tasks/spec.rake +9 -0
  104. data/tasks/version.rake +51 -0
  105. metadata +456 -0
@@ -0,0 +1,105 @@
1
+ require 'spec_helper'
2
+ require 'service_template/generators/migration_generator'
3
+ require 'service_template/cli'
4
+
5
+ describe ServiceTemplate::Generators::MigrationGenerator do
6
+
7
+ let(:migration_filename) { 'foo' }
8
+ let(:test_migrations_directory) { 'spec/tmp' }
9
+
10
+ before do
11
+ allow_any_instance_of(described_class).to receive(:output_directory).and_return(test_migrations_directory)
12
+ allow_any_instance_of(described_class).to receive(:migration_filename).and_return(migration_filename)
13
+ end
14
+
15
+ after do
16
+ FileUtils.rm_rf(test_migrations_directory)
17
+ end
18
+
19
+ describe 'AddFooToBar flew:string:index brew:integer' do
20
+ before do
21
+ ServiceTemplate::CLI::Base.new.generate("migration", 'AddFooToBar', 'flew:string:index', 'brew:integer')
22
+ expected_migration_file = File.join(test_migrations_directory, 'foo.rb')
23
+ @migration_code = File.read(expected_migration_file)
24
+ end
25
+
26
+ it 'creates a camelized migration class' do
27
+ expect(@migration_code).to match(/class AddFooToBar/)
28
+ end
29
+
30
+ it 'adds the columns' do
31
+ expect(@migration_code).to match(/add_column :bars, :flew, :string/)
32
+ expect(@migration_code).to match(/add_column :bars, :brew, :integer/)
33
+ end
34
+
35
+ it 'adds the index on the correct column' do
36
+ expect(@migration_code).to match(/add_index :bars, :flew/)
37
+ end
38
+ end
39
+
40
+ describe 'RemoveFooFromBar flew:string brew:integer' do
41
+ before do
42
+ ServiceTemplate::CLI::Base.new.generate("migration", 'RemoveFooFromBar', 'flew:string', 'brew:integer')
43
+ expected_migration_file = File.join(test_migrations_directory, 'foo.rb')
44
+ @migration_code = File.read(expected_migration_file)
45
+ end
46
+
47
+ it 'creates a camelized migration class' do
48
+ expect(@migration_code).to match(/class RemoveFooFromBar/)
49
+ end
50
+
51
+ it 'removes the columns' do
52
+ expect(@migration_code).to match(/remove_column :bars, :flew, :string/)
53
+ expect(@migration_code).to match(/remove_column :bars, :brew, :integer/)
54
+ end
55
+ end
56
+
57
+ describe 'CreateJoinTableFooBar foo bar' do
58
+ before do
59
+ ServiceTemplate::CLI::Base.new.generate("migration", 'CreateJoinTableFooBar', 'foo', 'bar')
60
+ expected_migration_file = File.join(test_migrations_directory, 'foo.rb')
61
+ @migration_code = File.read(expected_migration_file)
62
+ end
63
+
64
+ it 'creates a camelized migration class' do
65
+ expect(@migration_code).to match(/class CreateJoinTableFooBar/)
66
+ end
67
+
68
+ it 'creates the join table' do
69
+ expect(@migration_code).to match(/create_join_table :foos, :bars/)
70
+ end
71
+
72
+ it 'adds placeholders for the indexing' do
73
+ expect(@migration_code).to match(/# t.index \[:foo_id, :bar_id\]/)
74
+ expect(@migration_code).to match(/# t.index \[:bar_id, :foo_id\]/)
75
+ end
76
+ end
77
+
78
+ describe 'CreateSkrillex drops:integer hair:string:index' do
79
+ before do
80
+ ServiceTemplate::CLI::Base.new.generate("migration", 'CreateSkrillex', 'drops:integer', 'hair:string:index')
81
+ expected_migration_file = File.join(test_migrations_directory, 'foo.rb')
82
+ @migration_code = File.read(expected_migration_file)
83
+ end
84
+
85
+ it 'creates a camelized migration class' do
86
+ expect(@migration_code).to match(/class CreateSkrillex/)
87
+ end
88
+
89
+ it 'creates the table' do
90
+ expect(@migration_code).to match(/create_table :skrillexes/)
91
+ end
92
+
93
+ it 'adds the columns' do
94
+ expect(@migration_code).to match(/t.integer :drops/)
95
+ expect(@migration_code).to match(/t.string :hair/)
96
+ end
97
+
98
+ it 'adds the index on the correct column' do
99
+ expect(@migration_code).to match(/add_index :skrillexes, :hair/)
100
+ end
101
+ end
102
+
103
+ describe
104
+
105
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+ require 'service_template/generators/readme_generator'
3
+ require 'service_template/cli'
4
+
5
+ describe ServiceTemplate::Generators::ReadmeGenerator do
6
+ let(:test_readme_directory) { 'spec/tmp' }
7
+
8
+ before do
9
+ allow_any_instance_of(described_class).to receive(:output_directory).and_return(test_readme_directory)
10
+ ServiceTemplate::CLI::Base.new.generate("readme")
11
+ end
12
+
13
+ after do
14
+ FileUtils.rm_rf(test_readme_directory)
15
+ end
16
+
17
+ describe 'README' do
18
+ it 'creates a README in the current directory' do
19
+ expected_readme_file = File.join(test_readme_directory, 'README.md')
20
+ readme = File.read(expected_readme_file)
21
+
22
+ expect(readme).to match /# #{ServiceTemplate::Identity.name}/
23
+ end
24
+ end
25
+
26
+ describe 'spec' do
27
+ it 'creates a README spec' do
28
+ expected_spec_file = File.join(test_readme_directory, 'spec/docs/readme_spec.rb')
29
+ spec_code = File.read(expected_spec_file)
30
+
31
+ expect(spec_code).to match(/describe \'README\'/)
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+ require 'service_template/generators/scaffold_generator'
3
+ require 'service_template/cli'
4
+
5
+ describe ServiceTemplate::Generators::ScaffoldGenerator do
6
+ let(:app_name) { 'my_test_app' }
7
+ let(:app_path) { 'spec/my_different_directory' }
8
+ let(:options) { {} }
9
+
10
+ before do
11
+ scaffold = ServiceTemplate::CLI::Base.new(args, options)
12
+ scaffold.invoke(:new)
13
+ end
14
+
15
+ after do
16
+ if args[1] # if app_path exists, delete dir at app_path
17
+ FileUtils.rm_rf(args[1])
18
+ else # otherwise delete dir at app_name
19
+ FileUtils.rm_rf(args[0])
20
+ end
21
+ end
22
+
23
+ context 'given only an app name' do
24
+ let(:args) { [app_name] }
25
+
26
+ it 'creates a scaffold app in a directory that mirrors the app name' do
27
+ args = [app_name]
28
+ expect(Dir).to exist(app_name)
29
+ end
30
+ end
31
+
32
+ context 'given an app name and a directory' do
33
+ let(:args) { [app_name, app_path] }
34
+
35
+ it 'creates a scaffold app in a directory of my choosing' do
36
+ expect(Dir).to exist(app_path)
37
+ end
38
+
39
+ it 'creates a .env file with with a development database name' do
40
+ expect(File).to exist("#{app_path}/.env")
41
+ env_file = File.read("#{app_path}/.env")
42
+ expect(env_file).to match(/#{app_name}_development/)
43
+ end
44
+
45
+ it 'creates a .env.test file with a test database name' do
46
+ expect(File).to exist("#{app_path}/.env.test")
47
+ env_test_file = File.read("#{app_path}/.env.test")
48
+ expect(env_test_file).to match(/#{app_name}_test/)
49
+ end
50
+
51
+ it 'selects mysql as the default database adapter' do
52
+ database_config_file = File.read("#{app_path}/config/database.yml")
53
+ expect(database_config_file).to match(/adapter: mysql2/)
54
+ end
55
+
56
+ it 'adds the mysql2 gem in the Gemfile' do
57
+ gemfile = File.read("#{app_path}/Gemfile")
58
+ expect(gemfile).to match(/gem 'mysql2'/)
59
+ end
60
+
61
+ it 'generates an application api' do
62
+ expect(File).to exist("#{app_path}/app/apis/application_api.rb")
63
+ end
64
+
65
+ it 'the application API inherits from Grape::API' do
66
+ application_api_file = File.read("#{app_path}/app/apis/application_api.rb")
67
+ expect(application_api_file).to match(/class ApplicationApi < Grape::API/)
68
+ end
69
+
70
+ it 'generates an example API and spec' do
71
+ expect(File).to exist("#{app_path}/app/apis/hello_api.rb")
72
+ expect(File).to exist("#{app_path}/spec/apis/hello_api_spec.rb")
73
+ end
74
+ end
75
+
76
+ context 'with the -d=pg option' do
77
+ let(:args) { [app_name, app_path] }
78
+ let(:options) { { :database => "pg" } }
79
+
80
+ it 'selects postres/pg as the database' do
81
+ database_config_file = File.read("#{app_path}/config/database.yml")
82
+ expect(database_config_file).to match(/adapter: postgresql/)
83
+ end
84
+
85
+ it 'adds the pg gem in the Gemfile' do
86
+ gemfile = File.read("#{app_path}/Gemfile")
87
+ expect(gemfile).to match(/gem 'pg'/)
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+ require 'rack/test'
3
+
4
+ describe ServiceTemplate::GrapeExtenders do
5
+ include Rack::Test::Methods
6
+
7
+ before do
8
+ allow(ServiceTemplate::Logger.logger).to receive(:debug)
9
+ end
10
+
11
+ subject do
12
+ Class.new(Grape::API) do
13
+ format :json
14
+ extend ServiceTemplate::GrapeExtenders
15
+ end
16
+ end
17
+
18
+ def app
19
+ subject
20
+ end
21
+
22
+ describe 'ActiveRecord extensions' do
23
+ it 'rescues ActiveRecord::RecordNotFound and returns a 404' do
24
+ subject.get do
25
+ raise ActiveRecord::RecordNotFound
26
+ end
27
+
28
+ get '/'
29
+ expect(response_code).to be 404
30
+ expect(parsed_response.error.code).to eq 'record_not_found'
31
+ end
32
+ end
33
+
34
+ describe 'AASM extensions' do
35
+ it 'rescues AASM::InvalidTransition and returns a 422' do
36
+ module AASM
37
+ class InvalidTransition < StandardError
38
+ end
39
+ end
40
+
41
+ subject.get do
42
+ raise AASM::InvalidTransition
43
+ end
44
+
45
+ get '/'
46
+ expect(response_code).to be 422
47
+ expect(parsed_response.error.code).to eq 'unprocessable_entity'
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'service_template/grape_extensions/error_formatter'
3
+
4
+ describe Grape::ErrorFormatter::Json do
5
+ context '#call' do
6
+ it 'returns an api_error for plain error messages' do
7
+ error = Grape::ErrorFormatter::Json.call('test message', nil)
8
+ parsed = JSON.parse(error)
9
+ expect(parsed['error']['code']).to eq('api_error')
10
+ expect(parsed['error']['message']).to eq('test message')
11
+ end
12
+
13
+ it 'returns a specified error when given a ServiceTemplate::JsonError object' do
14
+ json_error = ServiceTemplate::JsonError.new(:foo, 'bar')
15
+ error = Grape::ErrorFormatter::Json.call(json_error, nil)
16
+ parsed = JSON.parse(error)
17
+ expect(parsed['error']['code']).to eq('foo')
18
+ expect(parsed['error']['message']).to eq('bar')
19
+ end
20
+
21
+ it 'adds the backtrace with rescue_option[:backtrace] specified' do
22
+ error = Grape::ErrorFormatter::Json.call('',
23
+ 'backtrace',
24
+ rescue_options: {backtrace: true})
25
+ parsed = JSON.parse(error)
26
+ expect(parsed['backtrace']).to eq('backtrace')
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'service_template/output_formatters/include_nil'
3
+ require 'service_template/grape_extensions/grape_helpers'
4
+ require 'pry'
5
+
6
+ describe ServiceTemplate::Representable::IncludeNil do
7
+ class FooRepresenter < ServiceTemplate::Representer
8
+ include ServiceTemplate::Representable::IncludeNil
9
+ property :foo
10
+ property :bar
11
+ end
12
+
13
+ class DummyClass
14
+ include ServiceTemplate::GrapeHelpers
15
+ end
16
+
17
+ it 'includes nil keys in a represented hash' do
18
+ input = OpenStruct.new(foo: 1, bar: nil)
19
+ output = DummyClass.new.represent(input, with: FooRepresenter).to_h
20
+ expect(output[:data]).to have_key('foo')
21
+ expect(output[:data]).to have_key('bar')
22
+ end
23
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+ require 'service_template/identity'
3
+
4
+ describe ServiceTemplate::Identity do
5
+ context '#name' do
6
+ it "returns 'api-service' if no ENV['SERVICE_NAME'] is set" do
7
+ ENV['SERVICE_NAME'] = nil
8
+ expect(ServiceTemplate::Identity.name).to eq('api-service')
9
+ end
10
+
11
+ it "returns the ENV['SERVICE_NAME'] when specified" do
12
+ ENV['SERVICE_NAME'] = nil
13
+ ENV['SERVICE_NAME'] = 'my-service'
14
+ expect(ServiceTemplate::Identity.name).to eq('my-service')
15
+ end
16
+ end
17
+
18
+ context '#hostname' do
19
+ it 'returns the value of the hostname system call and doesn\'t make a second system call' do
20
+ expect(ServiceTemplate::Identity).to receive(:`).with('hostname').and_return('system-hostname')
21
+ expect(ServiceTemplate::Identity.hostname).to eq('system-hostname')
22
+
23
+ expect(ServiceTemplate::Identity).to_not receive(:`).with('hostname')
24
+ expect(ServiceTemplate::Identity.hostname).to eq('system-hostname')
25
+ end
26
+ end
27
+
28
+ context '#revision' do
29
+ it 'returns the value of the \'git rev-parse HEAD\' system call and doesn\'t make a second system call' do
30
+ expect(ServiceTemplate::Identity).to receive(:`).with('git rev-parse HEAD').and_return('12345')
31
+ expect(ServiceTemplate::Identity.revision).to eq('12345')
32
+
33
+ expect(ServiceTemplate::Identity).to_not receive(:`).with('git rev-parse HEAD')
34
+ expect(ServiceTemplate::Identity.revision).to eq('12345')
35
+ end
36
+ end
37
+
38
+ context '#pid' do
39
+ it 'returns the process ID value' do
40
+ allow(Process).to receive(:pid).and_return(112233)
41
+ expect(ServiceTemplate::Identity.pid).to eq(112233)
42
+ end
43
+ end
44
+
45
+ context '#platform_revision' do
46
+ it 'returns the current version of the platform gem' do
47
+ expect(ServiceTemplate::Identity.platform_revision).to eq(ServiceTemplate::VERSION)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ require 'service_template/json_error'
3
+
4
+ describe ServiceTemplate::JsonError do
5
+ context '#to_json' do
6
+ it 'returns a json hash with the error data' do
7
+ error = ServiceTemplate::JsonError.new(:code, 'message').to_json
8
+ parsed = JSON.parse(error)
9
+
10
+ expect(parsed['error']['code']).to eq('code')
11
+ expect(parsed['error']['message']).to eq('message')
12
+ end
13
+
14
+ it 'returns a json hash with additional reasons' do
15
+ error = ServiceTemplate::JsonError.new(:code, 'message', {foo: 'bar'}).to_json
16
+ parsed = JSON.parse(error)
17
+
18
+ expect(parsed['error']['code']).to eq('code')
19
+ expect(parsed['error']['message']).to eq('message')
20
+ expect(parsed['error']['reasons']['foo']).to eq('bar')
21
+ end
22
+
23
+ it 'excludes `reasons` from hash if no reasons given' do
24
+ error = ServiceTemplate::JsonError.new(:code, 'message').to_json
25
+ parsed = JSON.parse(error)
26
+
27
+ expect(parsed['error']['code']).to eq('code')
28
+ expect(parsed['error']['message']).to eq('message')
29
+ expect(parsed['error']['reasons']).to be nil
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+ require 'service_template/logger/log_transaction'
3
+
4
+ describe ServiceTemplate::LogTransaction do
5
+ before(:each) do
6
+ ServiceTemplate::LogTransaction.clear
7
+ end
8
+
9
+ context '#id' do
10
+ it 'returns the current transaction id if it has been set' do
11
+ id = SecureRandom.hex(10)
12
+ Thread.current[:service_template_tid] = id
13
+ expect(ServiceTemplate::LogTransaction.id).to eq(id)
14
+ end
15
+
16
+ it 'sets and returns a new id if the transaction id hasn\'t been set' do
17
+ expect(ServiceTemplate::LogTransaction.id).to_not be_nil
18
+ end
19
+
20
+ it 'allows the id to be overridden by a setter' do
21
+ expect(ServiceTemplate::LogTransaction.id).to_not be_nil
22
+ ServiceTemplate::LogTransaction.id = 'foo'
23
+ expect(ServiceTemplate::LogTransaction.id).to eq('foo')
24
+ end
25
+ end
26
+
27
+ context '#clear' do
28
+ it 'sets the id to nil' do
29
+ expect(ServiceTemplate::LogTransaction.id).to_not be_nil
30
+ ServiceTemplate::LogTransaction.clear
31
+ expect(Thread.current[:service_template_tid]).to be_nil
32
+ end
33
+ end
34
+ end