lopata 0.1.11 → 0.1.15

Sign up to get free protection for your applications and to get access to all the features.
data/lib/lopata/role.rb CHANGED
@@ -1,91 +1,110 @@
1
- module Lopata
2
- # Adds ability to run scenarios by given user roles
3
- #
4
- # @example Usage
5
- # require 'lopata/role'
6
- # Lopata.configure do |c|
7
- # c.role_descriptions = {
8
- # user: 'User',
9
- # admin: 'Admin'
10
- # }
11
- # c.default_role = :user
12
- # c.before_scenaro 'setup user'
13
- # end
14
- # Lopata.shared_step 'setup user' do
15
- # setup { @user = User.create(role: current_role) if current_role }
16
- # cleanup :user
17
- # end
18
- # Lopata.define 'login' do
19
- # # will generate 2 scenarios, one for :user and one for :admin
20
- # as :user, :admin
21
- # action 'login'
22
- # # verify the user is logged in
23
- # end
24
- #
25
- # @see Lopata::Configuration#role_descriptions
26
- # @see Lopata::Configuration#default_role
27
- module Role
28
- # To be included in Lopata::Scenario
29
- module Methods
30
- # @return [Symbol, nil] user role for current scenario or nil, if scenario is running without user.
31
- def current_role
32
- metadata[:as]
33
- end
34
- end
35
-
36
- # To be included in Lopata::ScenarioBuilder
37
- module DSL
38
- # Enumerate the roles the scenario to be runned under.
39
- # If not invoked the default role only will be used.
40
- #
41
- # The scenario should be set to use the role via before_scenario step using #current_role param.
42
- #
43
- # @param args [Array<Symbol>] list of roles the scenario to be runned with.
44
- # @param block [Block] the block to calculate role from scenario metadata.
45
- def as(*args, &block)
46
- @roles = args.flatten
47
- @roles << Lopata::ScenarioBuilder::CalculatedValue.new(&block) if block_given?
48
- @role_options = nil
49
- end
50
-
51
- # @private
52
- def role_options
53
- @role_options ||= build_role_options
54
- end
55
-
56
- # Marks scenario to be runned without user.
57
- #
58
- # @example
59
- # Lopata.define 'scenario withou user' do
60
- # without_user
61
- # it 'does not define the user' do
62
- # expect(current_role).to be_nil
63
- # end
64
- # end
65
- def without_user
66
- @without_user = true
67
- end
68
-
69
- # @private
70
- def build_role_options
71
- return [] unless roles
72
- [Lopata::ScenarioBuilder::Diagonal.new(:as, roles.map { |r| [Lopata.configuration.role_descriptions[r], r] })]
73
- end
74
-
75
- # @private
76
- def roles
77
- return false if @without_user
78
- @roles ||= [Lopata.configuration.default_role].compact
79
- end
80
-
81
- # @private
82
- def diagonals
83
- super + role_options
84
- end
85
- end
86
- end
87
- end
88
-
89
- Lopata::Scenario.include Lopata::Role::Methods
90
- # Prepend the module to overload #diagonals method
1
+ module Lopata
2
+ # Adds ability to run scenarios by given user roles
3
+ #
4
+ # @example Usage
5
+ # require 'lopata/role'
6
+ # Lopata.configure do |c|
7
+ # c.role_descriptions = {
8
+ # user: 'User',
9
+ # admin: 'Admin'
10
+ # }
11
+ # c.default_role = :user
12
+ # c.before_scenaro 'setup user'
13
+ # end
14
+ # Lopata.shared_step 'setup user' do
15
+ # setup { @user = User.create(role: current_role) if current_role }
16
+ # cleanup :user
17
+ # end
18
+ # Lopata.define 'login' do
19
+ # # will generate 2 scenarios, one for :user and one for :admin
20
+ # as :user, :admin
21
+ # action 'login'
22
+ # # verify the user is logged in
23
+ # end
24
+ #
25
+ # @see Lopata::Configuration#role_descriptions
26
+ # @see Lopata::Configuration#default_role
27
+ module Role
28
+ # To be included in Lopata::Scenario
29
+ module Methods
30
+ # @return [Symbol, nil] user role for current scenario or nil, if scenario is running without user.
31
+ def current_role
32
+ metadata[:as]
33
+ end
34
+ end
35
+
36
+ # To be included in Lopata::ScenarioBuilder
37
+ module DSL
38
+ # Enumerate the roles the scenario to be runned under.
39
+ # If not invoked the default role only will be used.
40
+ #
41
+ # The scenario should be set to use the role via before_scenario step using #current_role param.
42
+ #
43
+ # @param args [Array<Symbol>] list of roles the scenario to be runned with.
44
+ # @param block [Block] the block to calculate role from scenario metadata.
45
+ def as(*args, &block)
46
+ @roles = args.flatten
47
+ @roles << Lopata::ScenarioBuilder::CalculatedValue.new(&block) if block_given?
48
+ @use_all_roles = true
49
+ @role_options = nil
50
+ end
51
+
52
+ # Enumerate the roles the scenario can be run.
53
+ #
54
+ # The scenario should be set to use the role via before_scenario step using #current_role param.
55
+ #
56
+ # Only first role will be used if scenario has no options or diagonales. Some first roles will be used if
57
+ # options or diagonales are declared, in order of appearence.
58
+ #
59
+ # Use this to describe possible roles, but not needed to run scenario with all of them in order to save time
60
+ # of running.
61
+ #
62
+ # @param args [Array<Symbol>] list of roles the scenario to be runned with.
63
+ def as_first(*args, &block)
64
+ @roles = args.flatten
65
+ @use_all_roles = false
66
+ @role_options = nil
67
+ end
68
+
69
+ # @private
70
+ def role_options
71
+ @role_options ||= build_role_options
72
+ end
73
+
74
+ # Marks scenario to be runned without user.
75
+ #
76
+ # @example
77
+ # Lopata.define 'scenario withou user' do
78
+ # without_user
79
+ # it 'does not define the user' do
80
+ # expect(current_role).to be_nil
81
+ # end
82
+ # end
83
+ def without_user
84
+ @without_user = true
85
+ end
86
+
87
+ # @private
88
+ def build_role_options
89
+ return [] unless roles
90
+ role_variants = roles.map { |r| [Lopata.configuration.role_descriptions[r], r] }
91
+ [Lopata::ScenarioBuilder::Diagonal.new(:as, role_variants, @use_all_roles)]
92
+ end
93
+
94
+ # @private
95
+ def roles
96
+ return false if @without_user
97
+ @roles ||= [Lopata.configuration.default_role].compact
98
+ end
99
+
100
+ # @private
101
+ def diagonals
102
+ super + role_options
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ Lopata::Scenario.include Lopata::Role::Methods
109
+ # Prepend the module to overload #diagonals method
91
110
  Lopata::ScenarioBuilder.prepend Lopata::Role::DSL
data/lib/lopata/runner.rb CHANGED
@@ -1,67 +1,67 @@
1
- require 'thor'
2
- require_relative 'generators/app'
3
- require_relative 'world'
4
- require_relative 'loader'
5
- require_relative '../lopata'
6
- require_relative 'observers'
7
- require_relative 'condition'
8
-
9
- module Lopata
10
- # @private
11
- class Runner < Thor
12
- desc 'test', 'Run tests'
13
- option :env, default: :qa, aliases: 'e'
14
- option :rerun, type: :boolean, aliases: 'r'
15
- option :keep, type: :boolean, aliases: 'k'
16
- option :text, aliases: 't'
17
- def test(*args)
18
- trap_interrupt
19
- configure_from_options
20
- Lopata::Loader.load_shared_steps
21
- Lopata::Loader.load_scenarios(*args)
22
- world = Lopata.world
23
- world.notify_observers(:started, world)
24
- world.scenarios.each { |s| s.run }
25
- world.notify_observers(:finished, world)
26
- end
27
-
28
- default_task :test
29
-
30
- register Generators::App, :new, 'lopata new project-name', 'Init new lopata projects'
31
-
32
- def self.exit_on_failure?
33
- true
34
- end
35
-
36
- no_commands do
37
- def configure_from_options
38
- Lopata.configure do |c|
39
- c.env = options[:env].to_sym
40
- c.keep = options[:keep]
41
- c.load_environment
42
- c.run_before_start_hooks
43
- end
44
- add_text_filter(options[:text]) if options[:text]
45
- add_rerun_filter if options[:rerun]
46
- end
47
-
48
- def add_text_filter(text)
49
- Lopata.configuration.filters << -> (scenario) { scenario.title.include?(text) }
50
- end
51
-
52
- def add_rerun_filter
53
- to_rerun = Lopata::Client.new.to_rerun
54
- Lopata.configuration.filters << -> (scenario) { to_rerun.include?(scenario.title) }
55
- end
56
-
57
- def trap_interrupt
58
- trap('INT') { exit!(1) }
59
- end
60
- end
61
- end
62
- end
63
-
64
- unless ARGV.first == 'new'
65
- eval File.binread('./Lopatafile') if File.exists?('./Lopatafile')
66
- end
67
-
1
+ require 'thor'
2
+ require_relative 'generators/app'
3
+ require_relative 'world'
4
+ require_relative 'loader'
5
+ require_relative '../lopata'
6
+ require_relative 'observers'
7
+ require_relative 'condition'
8
+
9
+ module Lopata
10
+ # @private
11
+ class Runner < Thor
12
+ desc 'test', 'Run tests'
13
+ option :env, default: :qa, aliases: 'e'
14
+ option :rerun, type: :boolean, aliases: 'r'
15
+ option :keep, type: :boolean, aliases: 'k'
16
+ option :text, aliases: 't'
17
+ def test(*args)
18
+ trap_interrupt
19
+ configure_from_options
20
+ Lopata::Loader.load_shared_steps
21
+ Lopata::Loader.load_scenarios(*args)
22
+ world = Lopata.world
23
+ world.notify_observers(:started, world)
24
+ world.scenarios.each { |s| s.run }
25
+ world.notify_observers(:finished, world)
26
+ end
27
+
28
+ default_task :test
29
+
30
+ register Generators::App, :new, 'lopata new project-name', 'Init new lopata projects'
31
+
32
+ def self.exit_on_failure?
33
+ true
34
+ end
35
+
36
+ no_commands do
37
+ def configure_from_options
38
+ Lopata.configure do |c|
39
+ c.env = options[:env].to_sym
40
+ c.keep = options[:keep]
41
+ c.load_environment
42
+ c.run_before_start_hooks
43
+ end
44
+ add_text_filter(options[:text]) if options[:text]
45
+ add_rerun_filter if options[:rerun]
46
+ end
47
+
48
+ def add_text_filter(text)
49
+ Lopata.configuration.filters << -> (scenario) { scenario.title.include?(text) }
50
+ end
51
+
52
+ def add_rerun_filter
53
+ to_rerun = Lopata::Client.new.to_rerun
54
+ Lopata.configuration.filters << -> (scenario) { to_rerun.include?(scenario.title) }
55
+ end
56
+
57
+ def trap_interrupt
58
+ trap('INT') { exit!(1) }
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ unless ARGV.first == 'new'
65
+ eval File.binread('./Lopatafile') if File.exists?('./Lopatafile')
66
+ end
67
+
@@ -1,136 +1,136 @@
1
- require 'rspec/expectations'
2
-
3
- # Scenario runtime class.
4
- #
5
- # All the scenarios are running in context of separate Lopata::Scenario object.
6
- #
7
- class Lopata::Scenario
8
- include RSpec::Matchers
9
-
10
- # @private
11
- attr_reader :execution
12
-
13
- # @private
14
- def initialize(execution)
15
- @execution = execution
16
- end
17
-
18
- # Marks current step as pending
19
- # @example
20
- # it 'pending step' do
21
- # pending
22
- # expect(1).to eq 2
23
- # end
24
- #
25
- # Pending steps wont be failed
26
- def pending(message = nil)
27
- execution.current_step.pending!(message)
28
- end
29
-
30
- # @return [Hash] metadata available for current step
31
- # @note The metadata keys also availalbe as methods (via method_missing)
32
- def metadata
33
- execution.metadata
34
- end
35
-
36
- private
37
-
38
- # @private
39
- def method_missing(method, *args, &block)
40
- if execution.let_methods.include?(method)
41
- instance_exec(*args, &execution.let_methods[method])
42
- elsif metadata.keys.include?(method)
43
- metadata[method]
44
- else
45
- super
46
- end
47
- end
48
-
49
- # @private
50
- def respond_to_missing?(method, *)
51
- execution.let_methods.include?(method) or metadata.keys.include?(method) or super
52
- end
53
-
54
- # @private
55
- # Scenario execution and live-cycle information
56
- class Execution
57
- attr_reader :scenario, :status, :steps, :title, :current_step
58
-
59
- def initialize(title, options_title, metadata = {})
60
- @title = [title, options_title].compact.reject(&:empty?).join(' ')
61
- @metadata = metadata
62
- @let_methods = {}
63
- @status = :not_runned
64
- @steps = []
65
- @scenario = Lopata::Scenario.new(self)
66
- end
67
-
68
- def run
69
- @status = :running
70
- sort_steps
71
- world.notify_observers(:scenario_started, self)
72
- steps.each(&method(:run_step))
73
- @status = steps.any?(&:failed?) ? :failed : :passed
74
- world.notify_observers(:scenario_finished, self)
75
- cleanup
76
- end
77
-
78
- def run_step(step)
79
- return if step.skipped?
80
- @current_step = step
81
- step.run(scenario)
82
- skip_rest if step.failed? && step.skip_rest_on_failure?
83
- @current_step = nil
84
- end
85
-
86
- def world
87
- Lopata.world
88
- end
89
-
90
- def failed?
91
- status == :failed
92
- end
93
-
94
- def sort_steps
95
- @steps = steps.reject(&:teardown_group?) + steps.select(&:teardown_group?)
96
- end
97
-
98
- def skip_rest
99
- steps.select { |s| s.status == :not_runned && !s.teardown? }.each(&:skip!)
100
- end
101
-
102
- def metadata
103
- if current_step
104
- @metadata.merge(current_step.metadata)
105
- else
106
- @metadata
107
- end
108
- end
109
-
110
- def let_methods
111
- if current_step
112
- @let_methods.merge(current_step.let_methods)
113
- else
114
- @let_methods
115
- end
116
- end
117
-
118
- def let(method_name, &block)
119
- # define_singleton_method method_name, &block
120
- base =
121
- if current_step && !current_step.groups.empty?
122
- current_step.groups.last.let_methods
123
- else
124
- @let_methods
125
- end
126
- base[method_name] = block
127
- end
128
-
129
- def cleanup
130
- @title = nil
131
- @metadata = nil
132
- @steps = nil
133
- @scenario = nil
134
- end
135
- end
136
- end
1
+ require 'rspec/expectations'
2
+
3
+ # Scenario runtime class.
4
+ #
5
+ # All the scenarios are running in context of separate Lopata::Scenario object.
6
+ #
7
+ class Lopata::Scenario
8
+ include RSpec::Matchers
9
+
10
+ # @private
11
+ attr_reader :execution
12
+
13
+ # @private
14
+ def initialize(execution)
15
+ @execution = execution
16
+ end
17
+
18
+ # Marks current step as pending
19
+ # @example
20
+ # it 'pending step' do
21
+ # pending
22
+ # expect(1).to eq 2
23
+ # end
24
+ #
25
+ # Pending steps wont be failed
26
+ def pending(message = nil)
27
+ execution.current_step.pending!(message)
28
+ end
29
+
30
+ # @return [Hash] metadata available for current step
31
+ # @note The metadata keys also availalbe as methods (via method_missing)
32
+ def metadata
33
+ execution.metadata
34
+ end
35
+
36
+ private
37
+
38
+ # @private
39
+ def method_missing(method, *args, &block)
40
+ if execution.let_methods.include?(method)
41
+ instance_exec(*args, &execution.let_methods[method])
42
+ elsif metadata.keys.include?(method)
43
+ metadata[method]
44
+ else
45
+ super
46
+ end
47
+ end
48
+
49
+ # @private
50
+ def respond_to_missing?(method, *)
51
+ execution.let_methods.include?(method) or metadata.keys.include?(method) or super
52
+ end
53
+
54
+ # @private
55
+ # Scenario execution and live-cycle information
56
+ class Execution
57
+ attr_reader :scenario, :status, :steps, :title, :current_step
58
+
59
+ def initialize(title, options_title, metadata = {})
60
+ @title = [title, options_title].compact.reject(&:empty?).join(' ')
61
+ @metadata = metadata
62
+ @let_methods = {}
63
+ @status = :not_runned
64
+ @steps = []
65
+ @scenario = Lopata::Scenario.new(self)
66
+ end
67
+
68
+ def run
69
+ @status = :running
70
+ sort_steps
71
+ world.notify_observers(:scenario_started, self)
72
+ steps.each(&method(:run_step))
73
+ @status = steps.any?(&:failed?) ? :failed : :passed
74
+ world.notify_observers(:scenario_finished, self)
75
+ cleanup
76
+ end
77
+
78
+ def run_step(step)
79
+ return if step.skipped?
80
+ @current_step = step
81
+ step.run(scenario)
82
+ skip_rest if step.failed? && step.skip_rest_on_failure?
83
+ @current_step = nil
84
+ end
85
+
86
+ def world
87
+ Lopata.world
88
+ end
89
+
90
+ def failed?
91
+ status == :failed
92
+ end
93
+
94
+ def sort_steps
95
+ @steps = steps.reject(&:teardown_group?) + steps.select(&:teardown_group?)
96
+ end
97
+
98
+ def skip_rest
99
+ steps.select { |s| s.status == :not_runned && !s.teardown? }.each(&:skip!)
100
+ end
101
+
102
+ def metadata
103
+ if current_step
104
+ @metadata.merge(current_step.metadata)
105
+ else
106
+ @metadata
107
+ end
108
+ end
109
+
110
+ def let_methods
111
+ if current_step
112
+ @let_methods.merge(current_step.let_methods)
113
+ else
114
+ @let_methods
115
+ end
116
+ end
117
+
118
+ def let(method_name, &block)
119
+ # define_singleton_method method_name, &block
120
+ base =
121
+ if current_step && !current_step.groups.empty?
122
+ current_step.groups.last.let_methods
123
+ else
124
+ @let_methods
125
+ end
126
+ base[method_name] = block
127
+ end
128
+
129
+ def cleanup
130
+ @title = nil
131
+ @metadata = nil
132
+ @steps = nil
133
+ @scenario = nil
134
+ end
135
+ end
136
+ end