Sha256: 653866e67d19dc71caee4f1e16f6d53a6e39884f13c8a3790a51c145f39d3ece

Contents?: true

Size: 1.98 KB

Versions: 1

Compression:

Stored size: 1.98 KB

Contents

require File.join(File.dirname(__FILE__), 'test_helper')
require 'workflow'
class AdvanceExamplesTest < ActiveRecordTestCase

  class Article
    include Workflow
    workflow do
      state :new do
        event :submit, :transitions_to => :awaiting_review
      end
      state :awaiting_review do
        event :review, :transitions_to => :being_reviewed
      end
      state :being_reviewed do
        event :accept, :transitions_to => :accepted
        event :reject, :transitions_to => :rejected
      end
      state :accepted do
      end
      state :rejected do
      end
    end
  end

  test '#63 undoing event - automatically add revert events for every defined event' do
    # also see https://github.com/geekq/workflow/issues/63
    spec = Article.workflow_spec
    spec.state_names.each do |state_name|
      state = spec.states[state_name]

        (state.events.values.reject {|e| e.name.to_s =~ /^revert_/ }).each do |event|
          event_name = event.name
          revert_event_name = "revert_" + event_name.to_s

          # Add revert events
          spec.states[event.transitions_to.to_sym].events[revert_event_name.to_sym] =
            Workflow::Event.new(revert_event_name, state, {})

          # Add methods for revert events
          Article.module_eval do
            define_method "#{revert_event_name}!".to_sym do |*args|
              process_event!(revert_event_name, *args)
            end
            define_method "can_#{revert_event_name}?" do
              return self.current_state.events.include?(revert_event_name)
            end
          end

        end
    end

    a = Article.new
    assert(a.new?, "should start with the 'new' state")
    a.submit!
    assert(a.awaiting_review?, "should now be in 'awaiting_review' state")
    assert_equal(['revert_submit', 'review'], a.current_state.events.keys.map(&:to_s).sort)
    a.revert_submit! # this method is added by our meta programming magic above
    assert(a.new?, "should now be back in the 'new' state")
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
workflow-1.0.0 test/advanced_examples_test.rb