lib/lopata/role.rb in lopata-0.1.13 vs lib/lopata/role.rb in lopata-0.1.14

- old
+ new

@@ -1,110 +1,110 @@ -module Lopata - # Adds ability to run scenarios by given user roles - # - # @example Usage - # require 'lopata/role' - # Lopata.configure do |c| - # c.role_descriptions = { - # user: 'User', - # admin: 'Admin' - # } - # c.default_role = :user - # c.before_scenaro 'setup user' - # end - # Lopata.shared_step 'setup user' do - # setup { @user = User.create(role: current_role) if current_role } - # cleanup :user - # end - # Lopata.define 'login' do - # # will generate 2 scenarios, one for :user and one for :admin - # as :user, :admin - # action 'login' - # # verify the user is logged in - # end - # - # @see Lopata::Configuration#role_descriptions - # @see Lopata::Configuration#default_role - module Role - # To be included in Lopata::Scenario - module Methods - # @return [Symbol, nil] user role for current scenario or nil, if scenario is running without user. - def current_role - metadata[:as] - end - end - - # To be included in Lopata::ScenarioBuilder - module DSL - # Enumerate the roles the scenario to be runned under. - # If not invoked the default role only will be used. - # - # The scenario should be set to use the role via before_scenario step using #current_role param. - # - # @param args [Array<Symbol>] list of roles the scenario to be runned with. - # @param block [Block] the block to calculate role from scenario metadata. - def as(*args, &block) - @roles = args.flatten - @roles << Lopata::ScenarioBuilder::CalculatedValue.new(&block) if block_given? - @use_all_roles = true - @role_options = nil - end - - # Enumerate the roles the scenario can be run. - # - # The scenario should be set to use the role via before_scenario step using #current_role param. - # - # Only first role will be used if scenario has no options or diagonales. Some first roles will be used if - # options or diagonales are declared, in order of appearence. - # - # Use this to describe possible roles, but not needed to run scenario with all of them in order to save time - # of running. - # - # @param args [Array<Symbol>] list of roles the scenario to be runned with. - def as_first(*args, &block) - @roles = args.flatten - @use_all_roles = false - @role_options = nil - end - - # @private - def role_options - @role_options ||= build_role_options - end - - # Marks scenario to be runned without user. - # - # @example - # Lopata.define 'scenario withou user' do - # without_user - # it 'does not define the user' do - # expect(current_role).to be_nil - # end - # end - def without_user - @without_user = true - end - - # @private - def build_role_options - return [] unless roles - role_variants = roles.map { |r| [Lopata.configuration.role_descriptions[r], r] } - [Lopata::ScenarioBuilder::Diagonal.new(:as, role_variants, @use_all_roles)] - end - - # @private - def roles - return false if @without_user - @roles ||= [Lopata.configuration.default_role].compact - end - - # @private - def diagonals - super + role_options - end - end - end -end - -Lopata::Scenario.include Lopata::Role::Methods -# Prepend the module to overload #diagonals method +module Lopata + # Adds ability to run scenarios by given user roles + # + # @example Usage + # require 'lopata/role' + # Lopata.configure do |c| + # c.role_descriptions = { + # user: 'User', + # admin: 'Admin' + # } + # c.default_role = :user + # c.before_scenaro 'setup user' + # end + # Lopata.shared_step 'setup user' do + # setup { @user = User.create(role: current_role) if current_role } + # cleanup :user + # end + # Lopata.define 'login' do + # # will generate 2 scenarios, one for :user and one for :admin + # as :user, :admin + # action 'login' + # # verify the user is logged in + # end + # + # @see Lopata::Configuration#role_descriptions + # @see Lopata::Configuration#default_role + module Role + # To be included in Lopata::Scenario + module Methods + # @return [Symbol, nil] user role for current scenario or nil, if scenario is running without user. + def current_role + metadata[:as] + end + end + + # To be included in Lopata::ScenarioBuilder + module DSL + # Enumerate the roles the scenario to be runned under. + # If not invoked the default role only will be used. + # + # The scenario should be set to use the role via before_scenario step using #current_role param. + # + # @param args [Array<Symbol>] list of roles the scenario to be runned with. + # @param block [Block] the block to calculate role from scenario metadata. + def as(*args, &block) + @roles = args.flatten + @roles << Lopata::ScenarioBuilder::CalculatedValue.new(&block) if block_given? + @use_all_roles = true + @role_options = nil + end + + # Enumerate the roles the scenario can be run. + # + # The scenario should be set to use the role via before_scenario step using #current_role param. + # + # Only first role will be used if scenario has no options or diagonales. Some first roles will be used if + # options or diagonales are declared, in order of appearence. + # + # Use this to describe possible roles, but not needed to run scenario with all of them in order to save time + # of running. + # + # @param args [Array<Symbol>] list of roles the scenario to be runned with. + def as_first(*args, &block) + @roles = args.flatten + @use_all_roles = false + @role_options = nil + end + + # @private + def role_options + @role_options ||= build_role_options + end + + # Marks scenario to be runned without user. + # + # @example + # Lopata.define 'scenario withou user' do + # without_user + # it 'does not define the user' do + # expect(current_role).to be_nil + # end + # end + def without_user + @without_user = true + end + + # @private + def build_role_options + return [] unless roles + role_variants = roles.map { |r| [Lopata.configuration.role_descriptions[r], r] } + [Lopata::ScenarioBuilder::Diagonal.new(:as, role_variants, @use_all_roles)] + end + + # @private + def roles + return false if @without_user + @roles ||= [Lopata.configuration.default_role].compact + end + + # @private + def diagonals + super + role_options + end + end + end +end + +Lopata::Scenario.include Lopata::Role::Methods +# Prepend the module to overload #diagonals method Lopata::ScenarioBuilder.prepend Lopata::Role::DSL \ No newline at end of file