active_encode 0.1.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +3 -2
- data/Gemfile +35 -0
- data/README.md +15 -14
- data/Rakefile +5 -10
- data/active_encode.gemspec +8 -5
- data/app/jobs/active_encode/polling_job.rb +20 -0
- data/app/models/active_encode/encode_record.rb +5 -0
- data/db/migrate/20180822021048_create_active_encode_encode_records.rb +13 -0
- data/lib/active_encode.rb +1 -0
- data/lib/active_encode/base.rb +6 -2
- data/lib/active_encode/callbacks.rb +18 -35
- data/lib/active_encode/core.rb +64 -20
- data/lib/active_encode/engine.rb +7 -0
- data/lib/active_encode/engine_adapter.rb +2 -2
- data/lib/active_encode/engine_adapters/active_job_adapter.rb +7 -3
- data/lib/active_encode/engine_adapters/elastic_transcoder_adapter.rb +15 -15
- data/lib/active_encode/engine_adapters/inline_adapter.rb +6 -1
- data/lib/active_encode/engine_adapters/matterhorn_adapter.rb +18 -18
- data/lib/active_encode/engine_adapters/shingoncoder_adapter.rb +13 -9
- data/lib/active_encode/engine_adapters/test_adapter.rb +19 -12
- data/lib/active_encode/engine_adapters/zencoder_adapter.rb +10 -10
- data/lib/active_encode/global_id.rb +16 -0
- data/lib/active_encode/input.rb +9 -0
- data/lib/active_encode/output.rb +9 -0
- data/lib/active_encode/persistence.rb +45 -0
- data/lib/active_encode/polling.rb +24 -0
- data/lib/active_encode/status.rb +2 -6
- data/lib/active_encode/technical_metadata.rb +16 -1
- data/lib/active_encode/version.rb +1 -1
- data/spec/fixtures/elastic_transcoder/job_canceled.json +1 -1
- data/spec/fixtures/elastic_transcoder/job_completed.json +1 -1
- data/spec/fixtures/elastic_transcoder/job_created.json +1 -1
- data/spec/fixtures/elastic_transcoder/job_failed.json +1 -1
- data/spec/fixtures/elastic_transcoder/job_progressing.json +1 -1
- data/spec/integration/elastic_transcoder_adapter_spec.rb +87 -167
- data/spec/integration/matterhorn_adapter_spec.rb +34 -79
- data/spec/integration/shingoncoder_adapter_spec.rb +1 -1
- data/spec/integration/zencoder_adapter_spec.rb +1 -1
- data/spec/rails_helper.rb +22 -0
- data/spec/shared_specs/engine_adapter_specs.rb +124 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +15 -0
- data/spec/units/callbacks_spec.rb +16 -17
- data/spec/units/core_spec.rb +121 -2
- data/spec/units/engine_adapter_spec.rb +0 -12
- data/spec/units/global_id_spec.rb +49 -0
- data/spec/units/input_spec.rb +12 -0
- data/spec/units/output_spec.rb +12 -0
- data/spec/units/persistence_spec.rb +57 -0
- data/spec/units/polling_job_spec.rb +86 -0
- data/spec/units/polling_spec.rb +22 -0
- data/spec/units/status_spec.rb +21 -2
- metadata +89 -20
@@ -7,7 +7,7 @@ describe ActiveEncode::EngineAdapters::ShingoncoderAdapter do
|
|
7
7
|
ActiveEncode::Base.engine_adapter = :shingoncoder
|
8
8
|
end
|
9
9
|
after(:all) do
|
10
|
-
ActiveEncode::Base.engine_adapter = :
|
10
|
+
ActiveEncode::Base.engine_adapter = :test
|
11
11
|
end
|
12
12
|
|
13
13
|
let(:create_response) { Shingoncoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_create.json'))) }
|
@@ -7,7 +7,7 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
|
|
7
7
|
ActiveEncode::Base.engine_adapter = :zencoder
|
8
8
|
end
|
9
9
|
after(:all) do
|
10
|
-
ActiveEncode::Base.engine_adapter = :
|
10
|
+
ActiveEncode::Base.engine_adapter = :test
|
11
11
|
end
|
12
12
|
|
13
13
|
let(:create_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_create.json'))) }
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'engine_cart'
|
4
|
+
EngineCart.load_application!
|
5
|
+
|
6
|
+
require 'rspec/rails'
|
7
|
+
ActiveJob::Base.queue_adapter = :test
|
8
|
+
|
9
|
+
require 'database_cleaner'
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.before do |example|
|
13
|
+
if example.metadata[:db_clean]
|
14
|
+
DatabaseCleaner.clean_with(:truncation)
|
15
|
+
DatabaseCleaner.strategy = :truncation
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
config.after do |example|
|
20
|
+
DatabaseCleaner.clean if example.metadata[:db_clean]
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
RSpec.shared_examples 'an ActiveEncode::EngineAdapter' do |*_flags|
|
3
|
+
before do
|
4
|
+
raise 'adapter must be set with `let(:created_job)`' unless defined? created_job
|
5
|
+
raise 'adapter must be set with `let(:running_job)`' unless defined? running_job
|
6
|
+
raise 'adapter must be set with `let(:canceled_job)`' unless defined? canceled_job
|
7
|
+
raise 'adapter must be set with `let(:completed_job)`' unless defined? completed_job
|
8
|
+
raise 'adapter must be set with `let(:failed_job)`' unless defined? failed_job
|
9
|
+
end
|
10
|
+
|
11
|
+
it { is_expected.to respond_to :create }
|
12
|
+
it { is_expected.to respond_to :find }
|
13
|
+
it { is_expected.to respond_to :cancel }
|
14
|
+
|
15
|
+
describe "#create" do
|
16
|
+
subject { created_job }
|
17
|
+
|
18
|
+
it { is_expected.to be_a ActiveEncode::Base }
|
19
|
+
its(:id) { is_expected.not_to be_empty }
|
20
|
+
it { is_expected.to be_running }
|
21
|
+
its(:current_operations) { is_expected.to be_empty }
|
22
|
+
its(:percent_complete) { is_expected.to be < 100 }
|
23
|
+
its(:errors) { is_expected.to be_empty }
|
24
|
+
its(:created_at) { is_expected.to be_kind_of Time }
|
25
|
+
its(:updated_at) { is_expected.to be_nil }
|
26
|
+
its(:finished_at) { is_expected.to be_nil }
|
27
|
+
its(:tech_metadata) { is_expected.to be_empty }
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#find" do
|
31
|
+
context "a running encode" do
|
32
|
+
subject { running_job }
|
33
|
+
|
34
|
+
it 'returns an ActiveEncode::Base object' do
|
35
|
+
expect(subject.class).to be ActiveEncode::Base
|
36
|
+
end
|
37
|
+
its(:id) { is_expected.to eq 'running-id' }
|
38
|
+
it { is_expected.to be_running }
|
39
|
+
its(:percent_complete) { is_expected.to be > 0 }
|
40
|
+
its(:errors) { is_expected.to be_empty }
|
41
|
+
its(:created_at) { is_expected.to be_kind_of Time }
|
42
|
+
its(:updated_at) { is_expected.to be > subject.created_at }
|
43
|
+
its(:finished_at) { is_expected.to be_nil }
|
44
|
+
end
|
45
|
+
|
46
|
+
context "a cancelled encode" do
|
47
|
+
subject { canceled_job }
|
48
|
+
|
49
|
+
it 'returns an ActiveEncode::Base object' do
|
50
|
+
expect(subject.class).to be ActiveEncode::Base
|
51
|
+
end
|
52
|
+
its(:id) { is_expected.to eq 'cancelled-id' }
|
53
|
+
it { is_expected.to be_cancelled }
|
54
|
+
its(:percent_complete) { is_expected.to be > 0 }
|
55
|
+
its(:errors) { is_expected.to be_empty }
|
56
|
+
its(:created_at) { is_expected.to be_kind_of Time }
|
57
|
+
its(:finished_at) { is_expected.to be >= subject.created_at }
|
58
|
+
its(:tech_metadata) { is_expected.to be_empty }
|
59
|
+
end
|
60
|
+
|
61
|
+
context "a completed encode" do
|
62
|
+
subject { completed_job }
|
63
|
+
|
64
|
+
it 'returns an ActiveEncode::Base object' do
|
65
|
+
expect(subject.class).to be ActiveEncode::Base
|
66
|
+
end
|
67
|
+
its(:id) { is_expected.to eq 'completed-id' }
|
68
|
+
it { is_expected.to be_completed }
|
69
|
+
its(:output) { is_expected.to eq completed_output }
|
70
|
+
its(:percent_complete) { is_expected.to eq 100 }
|
71
|
+
its(:errors) { is_expected.to be_empty }
|
72
|
+
its(:created_at) { is_expected.to be_kind_of Time }
|
73
|
+
its(:updated_at) { is_expected.to be > subject.created_at }
|
74
|
+
its(:finished_at) { is_expected.to be >= subject.updated_at }
|
75
|
+
its(:tech_metadata) { is_expected.to include completed_tech_metadata }
|
76
|
+
end
|
77
|
+
|
78
|
+
context "a failed encode" do
|
79
|
+
subject { failed_job }
|
80
|
+
|
81
|
+
it 'returns an ActiveEncode::Base object' do
|
82
|
+
expect(subject.class).to be ActiveEncode::Base
|
83
|
+
end
|
84
|
+
its(:id) { is_expected.to eq 'failed-id' }
|
85
|
+
it { is_expected.to be_failed }
|
86
|
+
its(:percent_complete) { is_expected.to be > 0 }
|
87
|
+
its(:errors) { is_expected.not_to be_empty }
|
88
|
+
its(:created_at) { is_expected.to be_kind_of Time }
|
89
|
+
its(:updated_at) { is_expected.to be > subject.created_at }
|
90
|
+
its(:finished_at) { is_expected.to be >= subject.updated_at }
|
91
|
+
its(:tech_metadata) { is_expected.to include failed_tech_metadata }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "#cancel!" do
|
96
|
+
subject { cancelling_job.cancel! }
|
97
|
+
|
98
|
+
it 'returns an ActiveEncode::Base object' do
|
99
|
+
expect(subject.class).to be ActiveEncode::Base
|
100
|
+
end
|
101
|
+
its(:id) { is_expected.to eq 'cancelled-id' }
|
102
|
+
it { is_expected.to be_cancelled }
|
103
|
+
its(:percent_complete) { is_expected.to be > 0 }
|
104
|
+
its(:errors) { is_expected.to be_empty }
|
105
|
+
its(:created_at) { is_expected.to be_kind_of Time }
|
106
|
+
its(:finished_at) { is_expected.to be >= subject.created_at }
|
107
|
+
its(:tech_metadata) { is_expected.to be_empty }
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "reload" do
|
111
|
+
subject { running_job.reload }
|
112
|
+
|
113
|
+
it 'returns an ActiveEncode::Base object' do
|
114
|
+
expect(subject.class).to be ActiveEncode::Base
|
115
|
+
end
|
116
|
+
its(:id) { is_expected.to eq 'running-id' }
|
117
|
+
it { is_expected.to be_running }
|
118
|
+
its(:percent_complete) { is_expected.to be > 0 }
|
119
|
+
its(:errors) { is_expected.to be_empty }
|
120
|
+
its(:created_at) { is_expected.to be_kind_of Time }
|
121
|
+
its(:updated_at) { is_expected.to be > subject.created_at }
|
122
|
+
its(:finished_at) { is_expected.to be_nil }
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
class TestAppGenerator < Rails::Generators::Base
|
4
|
+
source_root "./spec/test_app_templates"
|
5
|
+
|
6
|
+
# if you need to generate any additional configuration
|
7
|
+
# into the test app, this generator will be run immediately
|
8
|
+
# after setting up the application
|
9
|
+
|
10
|
+
def install_engine
|
11
|
+
generate 'active_encode:install'
|
12
|
+
rake 'active_encode:install:migrations'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -3,15 +3,16 @@ require 'spec_helper'
|
|
3
3
|
describe ActiveEncode::Callbacks do
|
4
4
|
before do
|
5
5
|
class CallbackEncode < ActiveEncode::Base
|
6
|
+
after_find ->(encode) { encode.history << "CallbackEncode ran after_find" }
|
7
|
+
|
8
|
+
after_reload ->(encode) { encode.history << "CallbackEncode ran after_reload" }
|
9
|
+
|
6
10
|
before_create ->(encode) { encode.history << "CallbackEncode ran before_create" }
|
7
11
|
after_create ->(encode) { encode.history << "CallbackEncode ran after_create" }
|
8
12
|
|
9
13
|
before_cancel ->(encode) { encode.history << "CallbackEncode ran before_cancel" }
|
10
14
|
after_cancel ->(encode) { encode.history << "CallbackEncode ran after_cancel" }
|
11
15
|
|
12
|
-
before_purge ->(encode) { encode.history << "CallbackEncode ran before_purge" }
|
13
|
-
after_purge ->(encode) { encode.history << "CallbackEncode ran after_purge" }
|
14
|
-
|
15
16
|
around_create do |encode, block|
|
16
17
|
encode.history << "CallbackEncode ran around_create_start"
|
17
18
|
block.call
|
@@ -24,12 +25,6 @@ describe ActiveEncode::Callbacks do
|
|
24
25
|
encode.history << "CallbackEncode ran around_cancel_stop"
|
25
26
|
end
|
26
27
|
|
27
|
-
around_purge do |encode, block|
|
28
|
-
encode.history << "CallbackEncode ran around_purge_start"
|
29
|
-
block.call
|
30
|
-
encode.history << "CallbackEncode ran around_purge_stop"
|
31
|
-
end
|
32
|
-
|
33
28
|
def history
|
34
29
|
@history ||= []
|
35
30
|
end
|
@@ -40,6 +35,18 @@ describe ActiveEncode::Callbacks do
|
|
40
35
|
Object.send(:remove_const, :CallbackEncode)
|
41
36
|
end
|
42
37
|
|
38
|
+
describe 'find callback' do
|
39
|
+
let(:encode) { CallbackEncode.create("sample.mp4") }
|
40
|
+
subject { CallbackEncode.find(encode.id).history }
|
41
|
+
it { is_expected.to include("CallbackEncode ran after_find") }
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'reload callback' do
|
45
|
+
let(:encode) { CallbackEncode.create("sample.mp4") }
|
46
|
+
subject { encode.reload.history }
|
47
|
+
it { is_expected.to include("CallbackEncode ran after_reload") }
|
48
|
+
end
|
49
|
+
|
43
50
|
describe 'create callbacks' do
|
44
51
|
subject { CallbackEncode.create("sample.mp4").history }
|
45
52
|
it { is_expected.to include("CallbackEncode ran before_create") }
|
@@ -55,12 +62,4 @@ describe ActiveEncode::Callbacks do
|
|
55
62
|
it { is_expected.to include("CallbackEncode ran around_cancel_start") }
|
56
63
|
it { is_expected.to include("CallbackEncode ran around_cancel_stop") }
|
57
64
|
end
|
58
|
-
|
59
|
-
describe 'purge callbacks' do
|
60
|
-
subject { CallbackEncode.create("sample.mp4").purge!.history }
|
61
|
-
it { is_expected.to include("CallbackEncode ran before_purge") }
|
62
|
-
it { is_expected.to include("CallbackEncode ran after_purge") }
|
63
|
-
it { is_expected.to include("CallbackEncode ran around_purge_start") }
|
64
|
-
it { is_expected.to include("CallbackEncode ran around_purge_stop") }
|
65
|
-
end
|
66
65
|
end
|
data/spec/units/core_spec.rb
CHANGED
@@ -1,9 +1,128 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ActiveEncode::Core do
|
4
|
+
before do
|
5
|
+
class CustomEncode < ActiveEncode::Base
|
6
|
+
end
|
7
|
+
end
|
8
|
+
after do
|
9
|
+
Object.send(:remove_const, :CustomEncode)
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:encode_class) { ActiveEncode::Base }
|
13
|
+
|
14
|
+
describe 'attributes' do
|
15
|
+
subject { encode_class.new(nil) }
|
16
|
+
|
17
|
+
it { is_expected.to respond_to(:id, :input, :output, :options, :percent_complete, :current_operations) }
|
18
|
+
|
19
|
+
context 'with an ActiveEncode::Base subclass' do
|
20
|
+
let(:encode_class) { CustomEncode }
|
21
|
+
|
22
|
+
it { is_expected.to respond_to(:id, :input, :output, :options, :percent_complete, :current_operations) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
4
26
|
describe 'find' do
|
5
|
-
|
6
|
-
|
27
|
+
let(:id) { encode_class.create(nil).id }
|
28
|
+
subject { encode_class.find(id) }
|
29
|
+
|
30
|
+
it { is_expected.to be_a encode_class }
|
31
|
+
its(:id) { is_expected.to eq id }
|
32
|
+
|
33
|
+
context 'with no id' do
|
34
|
+
let(:id) { nil }
|
35
|
+
|
36
|
+
it 'raises an error' do
|
37
|
+
expect { subject }.to raise_error(ArgumentError)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with an ActiveEncode::Base subclass' do
|
42
|
+
let(:encode_class) { CustomEncode }
|
43
|
+
|
44
|
+
it { is_expected.to be_a encode_class }
|
45
|
+
its(:id) { is_expected.to eq id }
|
46
|
+
|
47
|
+
context 'casting' do
|
48
|
+
let(:id) { ActiveEncode::Base.create(nil).id }
|
49
|
+
|
50
|
+
it { is_expected.to be_a encode_class }
|
51
|
+
its(:id) { is_expected.to eq id }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe 'create' do
|
57
|
+
subject { encode_class.create(nil) }
|
58
|
+
|
59
|
+
it { is_expected.to be_a encode_class }
|
60
|
+
its(:id) { is_expected.not_to be nil }
|
61
|
+
its(:state) { is_expected.not_to be nil }
|
62
|
+
|
63
|
+
context 'with an ActiveEncode::Base subclass' do
|
64
|
+
let(:encode_class) { CustomEncode }
|
65
|
+
|
66
|
+
it { is_expected.to be_a encode_class }
|
67
|
+
its(:id) { is_expected.not_to be nil }
|
68
|
+
its(:state) { is_expected.not_to be nil }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '#create!' do
|
73
|
+
let(:encode) { encode_class.new(nil) }
|
74
|
+
subject { encode.create! }
|
75
|
+
|
76
|
+
it { is_expected.to equal encode }
|
77
|
+
it { is_expected.to be_a encode_class }
|
78
|
+
its(:id) { is_expected.not_to be nil }
|
79
|
+
its(:state) { is_expected.not_to be nil }
|
80
|
+
|
81
|
+
context 'with an ActiveEncode::Base subclass' do
|
82
|
+
let(:encode_class) { CustomEncode }
|
83
|
+
|
84
|
+
it { is_expected.to equal encode }
|
85
|
+
it { is_expected.to be_a encode_class }
|
86
|
+
its(:id) { is_expected.not_to be nil }
|
87
|
+
its(:state) { is_expected.not_to be nil }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#cancel!' do
|
92
|
+
let(:encode) { encode_class.create(nil) }
|
93
|
+
subject { encode.cancel! }
|
94
|
+
|
95
|
+
it { is_expected.to equal encode }
|
96
|
+
it { is_expected.to be_a encode_class }
|
97
|
+
its(:id) { is_expected.not_to be nil }
|
98
|
+
it { is_expected.to be_cancelled }
|
99
|
+
|
100
|
+
context 'with an ActiveEncode::Base subclass' do
|
101
|
+
let(:encode_class) { CustomEncode }
|
102
|
+
|
103
|
+
it { is_expected.to equal encode }
|
104
|
+
it { is_expected.to be_a encode_class }
|
105
|
+
its(:id) { is_expected.not_to be nil }
|
106
|
+
it { is_expected.to be_cancelled }
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe '#reload' do
|
111
|
+
let(:encode) { encode_class.create(nil) }
|
112
|
+
subject { encode.reload }
|
113
|
+
|
114
|
+
it { is_expected.to equal encode }
|
115
|
+
it { is_expected.to be_a encode_class }
|
116
|
+
its(:id) { is_expected.not_to be nil }
|
117
|
+
its(:state) { is_expected.not_to be nil }
|
118
|
+
|
119
|
+
context 'with an ActiveEncode::Base subclass' do
|
120
|
+
let(:encode_class) { CustomEncode }
|
121
|
+
|
122
|
+
it { is_expected.to equal encode }
|
123
|
+
it { is_expected.to be_a encode_class }
|
124
|
+
its(:id) { is_expected.not_to be nil }
|
125
|
+
its(:state) { is_expected.not_to be nil }
|
7
126
|
end
|
8
127
|
end
|
9
128
|
end
|
@@ -9,13 +9,7 @@ describe ActiveEncode::EngineAdapter do
|
|
9
9
|
|
10
10
|
def find(_, _ = {}); end
|
11
11
|
|
12
|
-
def list(*); end
|
13
|
-
|
14
12
|
def cancel(_encode); end
|
15
|
-
|
16
|
-
def purge(_encode); end
|
17
|
-
|
18
|
-
def remove_output(_encode, _output_id); end
|
19
13
|
end
|
20
14
|
|
21
15
|
class StubTwoAdapter
|
@@ -23,13 +17,7 @@ describe ActiveEncode::EngineAdapter do
|
|
23
17
|
|
24
18
|
def find(_id, _opts = {}); end
|
25
19
|
|
26
|
-
def list(*); end
|
27
|
-
|
28
20
|
def cancel(_encode); end
|
29
|
-
|
30
|
-
def purge(_encode); end
|
31
|
-
|
32
|
-
def remove_output(_encode, _output_id); end
|
33
21
|
end
|
34
22
|
end
|
35
23
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActiveEncode::GlobalID do
|
4
|
+
before do
|
5
|
+
class CustomEncode < ActiveEncode::Base
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
after do
|
10
|
+
Object.send(:remove_const, :CustomEncode)
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#to_global_id' do
|
14
|
+
let(:encode_class) { ActiveEncode::Base }
|
15
|
+
let(:encode) { encode_class.create(nil) }
|
16
|
+
subject { encode.to_global_id }
|
17
|
+
|
18
|
+
it { is_expected.to be_a GlobalID }
|
19
|
+
its(:model_class) { is_expected.to eq encode_class }
|
20
|
+
its(:model_id) { is_expected.to eq encode.id }
|
21
|
+
its(:app) { is_expected.to eq 'ActiveEncode' }
|
22
|
+
|
23
|
+
context 'with an ActiveEncode::Base subclass' do
|
24
|
+
let(:encode_class) { CustomEncode }
|
25
|
+
|
26
|
+
it { is_expected.to be_a GlobalID }
|
27
|
+
its(:model_class) { is_expected.to eq encode_class }
|
28
|
+
its(:model_id) { is_expected.to eq encode.id }
|
29
|
+
its(:app) { is_expected.to eq 'ActiveEncode' }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'GlobalID::Locator#locate' do
|
34
|
+
let(:encode_class) { ActiveEncode::Base }
|
35
|
+
let(:encode) { encode_class.create(nil) }
|
36
|
+
let(:global_id) { encode.to_global_id }
|
37
|
+
subject { GlobalID::Locator.locate(global_id) }
|
38
|
+
|
39
|
+
it { is_expected.to be_a encode_class }
|
40
|
+
its(:id) { is_expected.to eq encode.id }
|
41
|
+
|
42
|
+
context 'with an ActiveEncode::Base subclass' do
|
43
|
+
let(:encode_class) { CustomEncode }
|
44
|
+
|
45
|
+
it { is_expected.to be_a encode_class }
|
46
|
+
its(:id) { is_expected.to eq encode.id }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|