taza 0.8.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. data/History.txt +7 -0
  2. data/Manifest.txt +14 -0
  3. data/{README.txt → README} +0 -0
  4. data/README.textile +1 -0
  5. data/VERSION.yml +4 -0
  6. data/generators/flow/templates/flow.rb.erb +2 -5
  7. data/generators/page/templates/functional_page_spec.rb.erb +1 -1
  8. data/generators/partial/partial_generator.rb +57 -0
  9. data/generators/partial/templates/partial.rb.erb +7 -0
  10. data/generators/site/site_generator.rb +1 -0
  11. data/lib/app_generators/taza/taza_generator.rb +12 -16
  12. data/lib/app_generators/taza/templates/rakefile.rb.erb +7 -0
  13. data/lib/extensions/array.rb +10 -0
  14. data/lib/extensions/hash.rb +5 -0
  15. data/lib/extensions/object.rb +24 -0
  16. data/lib/extensions/string.rb +11 -0
  17. data/lib/taza.rb +7 -24
  18. data/lib/taza/browser.rb +9 -16
  19. data/lib/taza/entity.rb +34 -0
  20. data/lib/taza/fixture.rb +66 -0
  21. data/lib/taza/flow.rb +10 -15
  22. data/lib/taza/page.rb +13 -8
  23. data/lib/taza/settings.rb +17 -6
  24. data/lib/taza/site.rb +25 -19
  25. data/lib/taza/tasks.rb +42 -26
  26. data/spec/array_spec.rb +16 -0
  27. data/spec/browser_spec.rb +14 -28
  28. data/spec/entity_spec.rb +9 -0
  29. data/spec/fixture_spec.rb +34 -0
  30. data/spec/fixtures_spec.rb +21 -0
  31. data/spec/flow_generator_spec.rb +0 -20
  32. data/spec/hash_spec.rb +12 -0
  33. data/spec/object_spec.rb +29 -0
  34. data/spec/page_generator_spec.rb +0 -1
  35. data/spec/page_spec.rb +14 -0
  36. data/spec/partial_generator_spec.rb +38 -0
  37. data/spec/project_generator_spec.rb +6 -1
  38. data/spec/sandbox/fixtures/examples.yml +8 -0
  39. data/spec/sandbox/fixtures/users.yml +2 -0
  40. data/spec/sandbox/flows/batman.rb +4 -1
  41. data/spec/sandbox/pages/foo/partials/partial_the_reckoning.rb +2 -0
  42. data/spec/settings_spec.rb +5 -5
  43. data/spec/site_generator_spec.rb +5 -1
  44. data/spec/site_spec.rb +19 -29
  45. data/spec/spec_helper.rb +12 -4
  46. data/spec/string_spec.rb +7 -0
  47. data/spec/taza_tasks_spec.rb +17 -1
  48. metadata +59 -45
  49. data/Rakefile +0 -125
  50. data/lib/taza/browsers/ie_watir.rb +0 -8
  51. data/lib/taza/browsers/safari_watir.rb +0 -8
  52. data/spec/platform/osx/browser_spec.rb +0 -14
  53. data/spec/platform/windows/browser_spec.rb +0 -14
  54. data/spec/unit_helper_spec.rb +0 -14
@@ -12,15 +12,15 @@ module Taza
12
12
  #
13
13
  # From here you can create the logic needed to perform these flows without ever referencing a browser object:
14
14
  #
15
- # class CreateAnAccount < Taza::Flow
16
- # alias :widgets_of_the_future :site
17
- #
18
- # def run(params={})
19
- # widgets_of_the_future.home_page.create_an_account_link.click
20
- # widgets_of_the_future.create_an_account_page do |cap|
21
- # cap.email.set params[:email]
22
- # cap.password.set params[:password]
23
- # cap.submit.click
15
+ # module WidgetsOfTheFuture
16
+ # class WidgetsOfTheFuture < Taza::Site
17
+ # def create_an_account_flow(params={})
18
+ # home_page.create_an_account_link.click
19
+ # create_an_account_page do |cap|
20
+ # cap.email.set params[:email]
21
+ # cap.password.set params[:password]
22
+ # cap.submit.click
23
+ # end
24
24
  # end
25
25
  # end
26
26
  # end
@@ -31,15 +31,10 @@ module Taza
31
31
  # describe "Widgets of the Future" do
32
32
  # it "should do widgety things so that we can make more monies" do
33
33
  # WidgetsOfTheFuture.new do |w|
34
- # w.flow :create_an_account, :email => "i.am@the.widget.store.com", :password => "secret"
34
+ # w.create_an_account_flow :email => "i.am@the.widget.store.com", :password => "secret"
35
35
  # end
36
36
  # end
37
37
  # end
38
38
  class Flow
39
- attr_reader :site
40
-
41
- def initialize(site_instance)
42
- @site = site_instance
43
- end
44
39
  end
45
40
  end
@@ -1,17 +1,17 @@
1
1
  module Taza
2
2
  # An abstraction of a web page, place the elements you care about accessing in here as well as specify the filters that apply when trying to access the element.
3
- #
3
+ #
4
4
  # Example:
5
5
  # require 'taza'
6
6
  # class HomePage < Taza::Page
7
7
  # element(:foo) {browser.element_by_xpath('some xpath')}
8
- # filter :title_given, :foo
9
- #
8
+ # filter :title_given, :foo
9
+ #
10
10
  # def title_given
11
11
  # browser.title.nil?
12
12
  # end
13
13
  # end
14
- #
14
+ #
15
15
  # homepage.foo will return the element specified in the block if the filter returned true
16
16
  class Page
17
17
  attr_accessor :browser
@@ -39,12 +39,12 @@ module Taza
39
39
  # Example:
40
40
  # class HomePage < Taza::Page
41
41
  # element(:foo) {browser.element_by_xpath('some xpath')}
42
- # filter :title_given, :foo
42
+ # filter :title_given, :foo
43
43
  # #a filter will apply to all elements if none are specified
44
44
  # filter :some_filter
45
45
  # #a filter will also apply to all elements if the symbol :all is given
46
46
  # filter :another_filter, :all
47
- #
47
+ #
48
48
  # def some_filter
49
49
  # true
50
50
  # end
@@ -66,6 +66,7 @@ module Taza
66
66
 
67
67
  def initialize
68
68
  add_element_methods
69
+ @active_filters = []
69
70
  end
70
71
 
71
72
  def add_element_methods # :nodoc:
@@ -83,10 +84,14 @@ module Taza
83
84
  end
84
85
  end
85
86
  end
86
-
87
+
87
88
  def check_filters(params) # :nodoc:
88
89
  params[:filters].each do |filter_method|
89
- raise FilterError, "#{filter_method} returned false for #{params[:element_name]}" unless send(filter_method)
90
+ unless @active_filters.include?(filter_method)
91
+ @active_filters << filter_method
92
+ raise FilterError, "#{filter_method} returned false for #{params[:element_name]}" unless send(filter_method)
93
+ @active_filters.delete(filter_method)
94
+ end
90
95
  end
91
96
  end
92
97
  end
@@ -2,18 +2,29 @@ require 'activesupport'
2
2
 
3
3
  module Taza
4
4
  class Settings
5
+ # The config settings for a site.yml file. ENV variables will override the settings:
6
+ # Can override the browser in config via ENV['BROWSER']
7
+ # Can override the driver in config via ENV['DRIVER']
8
+ # Can override the timeout in config via ENV['TIMEOUT']
9
+ # Can override the server_ip in config via ENV['SERVER_IP']
10
+ # Can override the server_port in config via ENV['SERVER_PORT']
11
+ #
12
+ # Example:
13
+ # Taza::Settings.Config('google')
5
14
  def self.config(site_name)
6
15
  env_settings = {}
7
- env_settings[:browser] = ENV['browser'].to_sym if ENV['browser']
8
- env_settings[:driver] = ENV['driver'].to_sym if ENV['driver']
9
- env_settings[:timeout] = ENV['timeout'] if ENV['timeout']
10
- env_settings[:server_ip] = ENV['server_ip'] if ENV['server_ip']
11
- env_settings[:server_port] = ENV['server_port'] if ENV['server_port']
16
+ env_settings[:browser] = ENV['BROWSER'].to_sym if ENV['BROWSER']
17
+ env_settings[:driver] = ENV['DRIVER'].to_sym if ENV['DRIVER']
18
+ env_settings[:timeout] = ENV['TIMEOUT'] if ENV['TIMEOUT']
19
+ env_settings[:server_ip] = ENV['SERVER_IP'] if ENV['SERVER_IP']
20
+ env_settings[:server_port] = ENV['SERVER_PORT'] if ENV['SERVER_PORT']
12
21
  env_settings = {:browser=>:firefox,:driver=>:selenium}.merge(config_file.merge(env_settings))
13
22
  site_file(site_name).merge(env_settings)
14
23
  end
15
24
 
16
- def self.config_file # :nodoc:
25
+ # Loads the config file for the entire project and returns the hash.
26
+ # Does not override settings from the ENV variables.
27
+ def self.config_file
17
28
  YAML.load_file(config_file_path)
18
29
  end
19
30
 
@@ -45,10 +45,11 @@ module Taza
45
45
  # Sites can take a couple of parameters in the constructor:
46
46
  # :browser => a browser object to act on instead of creating one automatically
47
47
  # :url => the url of where to start the site
48
- def initialize(params={})
48
+ def initialize(params={},&block)
49
49
  @module_name = self.class.parent.to_s
50
50
  @class_name = self.class.to_s.split("::").last
51
51
  define_site_pages
52
+ define_flows
52
53
  config = Settings.config(@class_name)
53
54
  if params[:browser]
54
55
  @browser = params[:browser]
@@ -57,18 +58,20 @@ module Taza
57
58
  @i_created_browser = true
58
59
  end
59
60
  @browser.goto(params[:url] || config[:url])
61
+ execute_block_and_close_browser(browser,&block) if block_given?
62
+ end
60
63
 
61
- if block_given?
64
+ def execute_block_and_close_browser(browser)
65
+ begin
66
+ yield self
67
+ rescue => site_block_exception
68
+ ensure
62
69
  begin
63
- yield self
64
- rescue => site_block_exception
65
- ensure
66
- begin
67
- @@before_browser_closes.call(browser)
68
- rescue => before_browser_closes_block_exception
69
- end
70
- close_browser_and_raise_if site_block_exception || before_browser_closes_block_exception
70
+ @@before_browser_closes.call(browser)
71
+ rescue => before_browser_closes_block_exception
72
+ "" # so basically rcov has a bug where it would insist this block is uncovered when empty
71
73
  end
74
+ close_browser_and_raise_if site_block_exception || before_browser_closes_block_exception
72
75
  end
73
76
  end
74
77
 
@@ -78,9 +81,7 @@ module Taza
78
81
 
79
82
  def close_browser_and_raise_if original_error # :nodoc:
80
83
  begin
81
- if @i_created_browser
82
- @browser.close
83
- end
84
+ @browser.close if @i_created_browser
84
85
  ensure
85
86
  raise original_error if original_error
86
87
  end
@@ -102,6 +103,12 @@ module Taza
102
103
  end
103
104
  end
104
105
 
106
+ def define_flows # :nodoc:
107
+ Dir.glob(flows_path) do |file|
108
+ require file
109
+ end
110
+ end
111
+
105
112
  # This is used to call a flow belonging to the site
106
113
  #
107
114
  # Example:
@@ -118,14 +125,13 @@ module Taza
118
125
  # google.submit.click
119
126
  # end
120
127
  # end
121
- def flow(name,params={})
122
- require File.join(path,'flows',name.to_s.underscore)
123
- flow_class = "#{@module_name}::#{name.to_s.camelize}".constantize
124
- flow_class.new(self).run(params)
125
- end
126
128
 
127
129
  def pages_path # :nodoc:
128
- File.join(path,'pages','*.rb')
130
+ File.join(path,'pages','**','*.rb')
131
+ end
132
+
133
+ def flows_path # :nodoc:
134
+ File.join(path,'flows','*.rb')
129
135
  end
130
136
 
131
137
  def path # :nodoc:
@@ -1,38 +1,54 @@
1
- require 'rake'
2
- require 'rake/testtask'
3
1
  require 'rubygems'
2
+ require 'rake'
4
3
  require 'taglob/rake/tasks'
5
4
  require 'spec/rake/spectask'
6
5
 
7
- namespace :spec do
8
- def format_options(file_name)
9
- file_name = "artifacts/#{file_name}/index.html"
10
- dir_name = File.dirname(file_name)
11
- FileUtils.mkdir_p(dir_name) unless File.directory?(dir_name)
12
- ["--format","html:#{file_name}","--format","p"]
13
- end
6
+ def tags
7
+ ENV['TAGS']
8
+ end
14
9
 
15
- desc "Run all functional specs"
16
- Spec::Rake::SpecTask.new :functional do |t|
17
- t.spec_files = 'spec/functional/**/*_spec.rb'
18
- t.spec_opts << format_options("functional/all")
19
- end
20
- desc "Run all integration specs"
21
- Spec::Rake::SpecTask.new :integration do |t|
22
- t.spec_files = 'spec/integration/**/*_spec.rb'
23
- t.spec_opts << format_options("integration/all")
24
- end
10
+ module Taza
11
+ module Rake
12
+ class Tasks
13
+ attr_accessor :spec_opts
25
14
 
26
- namespace :functional do
27
- Dir.glob('./spec/functional/*/').each do |dir|
28
- site_name = File.basename(dir)
15
+ def initialize
16
+ yield self if block_given?
17
+ define
18
+ end
29
19
 
30
- desc "Run all functional specs for #{site_name}"
31
- Spec::Rake::SpecTask.new site_name.to_sym do |t|
32
- t.spec_files = "#{dir}**/*_spec.rb"
33
- t.spec_opts << format_options("functional/#{site_name}/all")
20
+ def define_spec_task(name,glob_path)
21
+ Spec::Rake::SpecTask.new name do |t|
22
+ t.spec_files = Dir.taglob(glob_path,tags)
23
+ t.spec_opts << spec_opts
24
+ end
34
25
  end
35
26
 
27
+ def define
28
+ namespace :spec do
29
+ desc "Run all functional specs"
30
+ define_spec_task(:functional,'spec/functional/**/*_spec.rb')
31
+ desc "Run all integration specs"
32
+ define_spec_task(:integration,'spec/integration/**/*_spec.rb')
33
+
34
+ namespace :functional do
35
+ Dir.glob('./spec/functional/*/').each do |dir|
36
+ site_name = File.basename(dir)
37
+ desc "Run all functional specs for #{site_name}"
38
+ define_spec_task(site_name,"#{dir}**/*_spec.rb")
39
+
40
+ namespace site_name do
41
+ Dir.glob("./spec/functional/#{site_name}/*_spec.rb").each do |page_spec_file|
42
+ page_name = File.basename(page_spec_file,'_spec.rb')
43
+ define_spec_task(page_name,page_spec_file)
44
+ end
45
+ end
46
+
47
+ end
48
+ end
49
+
50
+ end
51
+ end
36
52
  end
37
53
  end
38
54
  end
@@ -0,0 +1,16 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe 'Array Extensions' do
4
+ it "should know if elements are not equivilent to a subset of those elements" do
5
+ [1,2,3].should_not be_equivalent([2,3])
6
+ end
7
+ it "should know if elements are not equivilent to a larger set including those elements" do
8
+ [1,2,3].should_not be_equivalent([1,2,3,4])
9
+ end
10
+ it "should know it is equivalent if the same order" do
11
+ [1,2,3].should be_equivalent([1,2,3])
12
+ end
13
+ it "should know it is equivalent if the different orders" do
14
+ [1,2,3].should be_equivalent([2,1,3])
15
+ end
16
+ end
@@ -2,37 +2,22 @@ require 'spec/spec_helper'
2
2
  require 'taza/browser'
3
3
  require 'taza/settings'
4
4
  require 'selenium'
5
- require 'firewatir'
5
+ require 'watir'
6
6
 
7
7
  describe Taza::Browser do
8
8
 
9
9
  before :each do
10
10
  Taza::Settings.stubs(:config_file).returns({})
11
11
  ENV['TAZA_ENV'] = 'isolation'
12
- ENV['server_port'] = nil
13
- ENV['server_ip'] = nil
14
- ENV['browser'] = nil
15
- ENV['driver'] = nil
16
- ENV['timeout'] = nil
17
- end
18
-
19
- it "should be able to create a watir driver" do
20
- Taza::Browser.expects(:create_watir_ie)
21
- Taza::Browser.create(:browser => :ie, :driver => :watir)
22
- end
23
-
24
- it "should be able to create a firewatir driver" do
25
- Taza::Browser.expects(:create_watir_firefox)
26
- Taza::Browser.create(:browser => :firefox,:driver => :watir)
27
- end
28
-
29
- it "should be able to create a safariwatir driver" do
30
- Taza::Browser.expects(:create_watir_safari)
31
- Taza::Browser.create(:browser => :safari,:driver => :watir)
12
+ ENV['SERVER_PORT'] = nil
13
+ ENV['SERVER_IP'] = nil
14
+ ENV['BROWSER'] = nil
15
+ ENV['DRIVER'] = nil
16
+ ENV['TIMEOUT'] = nil
32
17
  end
33
18
 
34
19
  it "should raise unknown browser error for unsupported watir browsers" do
35
- lambda { Taza::Browser.create(:browser => :foo_browser_9000,:driver => :watir) }.should raise_error(BrowserUnsupportedError)
20
+ lambda { Taza::Browser.create(:browser => :foo_browser_9000,:driver => :watir) }.should raise_error(StandardError)
36
21
  end
37
22
 
38
23
  it "should use params browser type when creating selenium" do
@@ -52,21 +37,22 @@ describe Taza::Browser do
52
37
 
53
38
  it "should use environment settings for server port and ip" do
54
39
  Taza::Settings.stubs(:path).returns(File.join('spec','sandbox'))
55
- ENV['server_port'] = 'server_port'
56
- ENV['server_ip'] = 'server_ip'
40
+ ENV['SERVER_PORT'] = 'server_port'
41
+ ENV['SERVER_IP'] = 'server_ip'
57
42
  Selenium::SeleniumDriver.expects(:new).with('server_ip','server_port',anything,anything)
58
43
  Taza::Browser.create(Taza::Settings.config("SiteName"))
59
44
  end
60
45
 
61
46
  it "should use environment settings for timeout" do
62
47
  Taza::Settings.stubs(:path).returns(File.join('spec','sandbox'))
63
- ENV['timeout'] = 'timeout'
48
+ ENV['TIMEOUT'] = 'timeout'
64
49
  Selenium::SeleniumDriver.expects(:new).with(anything,anything,anything,'timeout')
65
50
  Taza::Browser.create(Taza::Settings.config("SiteName"))
66
51
  end
67
52
 
68
- it "should create firewatir instance" do
69
- FireWatir::Firefox.expects(:new)
70
- Taza::Browser.create(:browser => :firefox, :driver => :watir)
53
+ it "should be able to give you the class of browser" do
54
+ Taza::Browser.expects(:watir_safari).returns(Object)
55
+ Taza::Browser.browser_class(:browser => :safari, :driver => :watir).should eql(Object)
71
56
  end
57
+
72
58
  end
@@ -0,0 +1,9 @@
1
+ require 'spec/spec_helper'
2
+ require 'taza'
3
+
4
+ describe Taza::Entity do
5
+ it "should add methods for hash string keys" do
6
+ entity = Taza::Entity.new({'apple' => 'pie'},nil)
7
+ entity.should respond_to(:apple)
8
+ end
9
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec/spec_helper'
2
+ require 'taza'
3
+
4
+ describe Taza::Fixture do
5
+
6
+ it "should be able to load entries from fixtures" do
7
+ Taza::Fixture.any_instance.stubs(:base_path).returns('./spec/sandbox')
8
+ fixture = Taza::Fixture.new
9
+ fixture.load_all
10
+ example = fixture.get_fixture_entity(:examples,'first_example')
11
+ example.name.should eql("first")
12
+ example.price.should eql(1)
13
+ end
14
+
15
+ it "should use the spec folder as the base path" do
16
+ Taza::Fixture.new.base_path.should eql('./spec')
17
+ end
18
+
19
+ it "should know if a pluralized fixture of that name exists" do
20
+ Taza::Fixture.any_instance.stubs(:base_path).returns('./spec/sandbox')
21
+ fixture = Taza::Fixture.new
22
+ fixture.load_all
23
+ fixture.pluralized_fixture_exists?('example').should be_true
24
+ fixture.pluralized_fixture_exists?('foo').should be_false
25
+ end
26
+
27
+ it "should be able to get all fixtures loaded" do
28
+ Taza::Fixture.any_instance.stubs(:base_path).returns('./spec/sandbox')
29
+ fixture = Taza::Fixture.new
30
+ fixture.load_all
31
+ fixture.fixture_names.should be_equivalent([:examples,:users])
32
+ end
33
+
34
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec/spec_helper'
2
+ require 'taza/fixture'
3
+
4
+ describe Taza::Fixtures do
5
+ Taza::Fixture.any_instance.stubs(:base_path).returns('./spec/sandbox')
6
+ include Taza::Fixtures
7
+
8
+ it "should be able to look up a fixture entity off fixture_methods module" do
9
+ examples(:first_example).name.should eql('first')
10
+ end
11
+
12
+ it "should still raise method missing error" do
13
+ lambda{zomgwtf(:first_example)}.should raise_error(NoMethodError)
14
+ end
15
+
16
+ #TODO: this test tests what is in entity's instance eval not happy with it being here
17
+ it "should be able to look up a fixture entity off fixture_methods module" do
18
+ examples(:first_example).user.name.should eql(users(:shatner).name)
19
+ end
20
+
21
+ end