Skip to content

Commit

Permalink
Merge pull request #221 from greysteil/handle-custom-transition-assoc…
Browse files Browse the repository at this point in the history
…iation-names

Handle custom transition association names gracefully
  • Loading branch information
Harry Maclean authored May 15, 2017
2 parents 8c9a9d1 + ae989c4 commit 41b56ba
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 5 deletions.
8 changes: 7 additions & 1 deletion lib/statesman/adapters/active_record_queries.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,13 @@ def transition_name
end

def transition_reflection
reflect_on_association(transition_name)
reflect_on_all_associations(:has_many).each do |value|
return value if value.klass == transition_class
end

raise MissingTransitionAssociation,
"Could not find has_many association between #{self.class} " \
"and #{transition_class}."
end

def model_foreign_key
Expand Down
1 change: 1 addition & 0 deletions lib/statesman/exceptions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ class InvalidCallbackError < StandardError; end
class GuardFailedError < StandardError; end
class TransitionFailedError < StandardError; end
class TransitionConflictError < StandardError; end
class MissingTransitionAssociation < StandardError; end

class UnserializedMetadataError < StandardError
def initialize(transition_class_name)
Expand Down
32 changes: 28 additions & 4 deletions spec/statesman/adapters/active_record_queries_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -125,14 +125,18 @@ def self.initial_state
end
end

context "with a transition name" do
context "with a custom name for the transition association" do
before do
# Switch to using OtherActiveRecordModelTransition, so the existing
# relation with MyActiveRecordModelTransition doesn't interfere with
# this spec.
MyActiveRecordModel.send(:has_many,
:custom_name,
class_name: 'MyActiveRecordModelTransition')
class_name: 'OtherActiveRecordModelTransition')

MyActiveRecordModel.class_eval do
def self.transition_name
:custom_name
def self.transition_class
OtherActiveRecordModelTransition
end
end
end
Expand All @@ -142,4 +146,24 @@ def self.transition_name
specify { expect { query }.to_not raise_error }
end
end

context "with no association with the transition class" do
before do
class UnknownModelTransition < OtherActiveRecordModelTransition; end

MyActiveRecordModel.class_eval do
def self.transition_class
UnknownModelTransition
end
end
end

describe ".in_state" do
subject(:query) { MyActiveRecordModel.in_state(:succeeded) }

it "raises a helpful error" do
expect { query }.to raise_error(Statesman::MissingTransitionAssociation)
end
end
end
end

0 comments on commit 41b56ba

Please sign in to comment.