swamp 0.0.1

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 (67) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +2 -0
  3. data/.travis.yml +8 -0
  4. data/Gemfile +6 -0
  5. data/Gemfile.lock +79 -0
  6. data/README.md +5 -0
  7. data/Rakefile +8 -0
  8. data/bin/swamp +20 -0
  9. data/features/specifications/user_scans_a_page_interactively.feature +10 -0
  10. data/features/specifications/user_scans_buttons_in_a_page.feature +43 -0
  11. data/features/specifications/user_scans_fields_in_a_page.feature +38 -0
  12. data/features/specifications/user_scans_input_buttons_in_a_page.feature +28 -0
  13. data/features/specifications/user_scans_links_in_a_page.feature +18 -0
  14. data/features/specifications/user_scans_select_box_elements_in_a_page.feature +28 -0
  15. data/features/specifications/user_starts_swamp.feature +10 -0
  16. data/features/step_definitions/swamp_steps.rb +46 -0
  17. data/features/support/env.rb +2 -0
  18. data/features/support/page_examples/button.html +1 -0
  19. data/features/support/page_examples/button.html~ +0 -0
  20. data/features/support/page_examples/button_without_text.html +1 -0
  21. data/features/support/page_examples/button_without_text_id_and_value.html +1 -0
  22. data/features/support/page_examples/button_without_text_without_id_with_value.html +1 -0
  23. data/features/support/page_examples/checkbox.html +1 -0
  24. data/features/support/page_examples/field.html +1 -0
  25. data/features/support/page_examples/field_without_id.html +1 -0
  26. data/features/support/page_examples/input_submit.html +1 -0
  27. data/features/support/page_examples/input_submit_without_id.html +1 -0
  28. data/features/support/page_examples/link.html +1 -0
  29. data/features/support/page_examples/link.html~ +0 -0
  30. data/features/support/page_examples/link_with_id.html +5 -0
  31. data/features/support/page_examples/radio.html +1 -0
  32. data/features/support/page_examples/select_box_with_id.html +1 -0
  33. data/features/support/page_examples/select_box_with_name_only.html +1 -0
  34. data/features/support/setup.rb +42 -0
  35. data/lib/swamp/base.rb +29 -0
  36. data/lib/swamp/builder.rb +35 -0
  37. data/lib/swamp/button.rb +11 -0
  38. data/lib/swamp/buttons.rb +19 -0
  39. data/lib/swamp/element.rb +23 -0
  40. data/lib/swamp/elements.rb +39 -0
  41. data/lib/swamp/evaluator.rb +20 -0
  42. data/lib/swamp/field.rb +11 -0
  43. data/lib/swamp/fields.rb +21 -0
  44. data/lib/swamp/formatter.rb +51 -0
  45. data/lib/swamp/input_button.rb +11 -0
  46. data/lib/swamp/input_buttons.rb +19 -0
  47. data/lib/swamp/interface.rb +33 -0
  48. data/lib/swamp/link.rb +11 -0
  49. data/lib/swamp/links.rb +15 -0
  50. data/lib/swamp/select_box.rb +11 -0
  51. data/lib/swamp/select_boxes.rb +17 -0
  52. data/lib/swamp/version.rb +3 -0
  53. data/lib/swamp/wrapper.rb +25 -0
  54. data/lib/swamp.rb +26 -0
  55. data/spec/spec_helper.rb +12 -0
  56. data/spec/swamp/builder_spec.rb +36 -0
  57. data/spec/swamp/buttons_spec.rb +93 -0
  58. data/spec/swamp/evaluator_spec.rb +75 -0
  59. data/spec/swamp/fields_spec.rb +88 -0
  60. data/spec/swamp/formatter_spec.rb +59 -0
  61. data/spec/swamp/input_buttons_spec.rb +62 -0
  62. data/spec/swamp/interface_spec.rb +62 -0
  63. data/spec/swamp/links_spec.rb +34 -0
  64. data/spec/swamp/select_boxes_spec.rb +53 -0
  65. data/spec/swamp/wrapper_spec.rb +104 -0
  66. data/swamp.gemspec +31 -0
  67. metadata +274 -0
@@ -0,0 +1,20 @@
1
+ module Swamp
2
+ class Evaluator
3
+ def initialize(input, wrapper)
4
+ @input = input
5
+ @wrapper = wrapper
6
+ end
7
+
8
+ def valid_url?
9
+ @input.match(/^(http|https|file):\/\/.*$/i) ? true : false
10
+ end
11
+
12
+ def refresh_command?
13
+ enter_keystroke? and @wrapper.page_visited
14
+ end
15
+
16
+ def enter_keystroke?
17
+ @input == "\n"
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ module Swamp
2
+ class Field < Element
3
+ def method_signature
4
+ "type_#{format(@name)}(input)"
5
+ end
6
+
7
+ def accessor
8
+ "fill_in(\"#{@selector}\", with: input)"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ module Swamp
2
+ class Fields < Elements
3
+ def get
4
+ elements = []
5
+ page.all('input').map do |element|
6
+ if element.visible? and has_name?(element) and valid_type?(element)
7
+ if has_id?(element)
8
+ elements << Swamp::Field.new(element['name'], element['id'])
9
+ else
10
+ elements << Swamp::Field.new(element['name'], element['name'])
11
+ end
12
+ end
13
+ end
14
+ elements
15
+ end
16
+
17
+ def valid_type?(element)
18
+ element['type'] != "radio" and element['type'] != "checkbox" and element['type'] != "submit" ? true : false
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,51 @@
1
+ module Swamp
2
+ class Formatter
3
+
4
+ def format(name)
5
+ @name = name
6
+ @name = replace_dashes
7
+ @name = remove_white_spaces
8
+ @name = replace_parentheses
9
+ @name = replace_brackets
10
+ @name = remove_suffix_symbols
11
+ @name = downcase_name
12
+ end
13
+
14
+ def format_class(name)
15
+ @name = name
16
+ @name = replace_white_spaces_with_dots
17
+ end
18
+
19
+ def replace_white_spaces_with_dots
20
+ @name.gsub(" ",".")
21
+ end
22
+
23
+ def replace_dashes
24
+ @name.gsub("-","_")
25
+ end
26
+
27
+ def remove_white_spaces
28
+ @name.gsub(" ", "_")
29
+ end
30
+
31
+ def replace_parentheses
32
+ @name.gsub("(", "_").gsub(")", "_")
33
+ end
34
+
35
+ def replace_brackets
36
+ @name.gsub("[", "_").gsub("]", "_")
37
+ end
38
+
39
+ def remove_suffix_symbols
40
+ result = @name.match(/\w+?(?<symbols>[_]+\Z)/)
41
+ if result != nil
42
+ @name = @name.chomp(result[:symbols])
43
+ end
44
+ @name
45
+ end
46
+
47
+ def downcase_name
48
+ @name.downcase
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,11 @@
1
+ module Swamp
2
+ class InputButton < Element
3
+ def method_signature
4
+ format(@name)
5
+ end
6
+
7
+ def accessor
8
+ "find(:css, \"#{@selector}\").click"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ module Swamp
2
+ class InputButtons < Elements
3
+ def get
4
+ elements = []
5
+ page.all('input[type="submit"]').map do | element |
6
+ if element.visible?
7
+ if has_value?(element)
8
+ if has_id?(element)
9
+ elements << Swamp::InputButton.new(element["value"], "##{element["id"]}")
10
+ elsif has_class?(element)
11
+ elements << Swamp::InputButton.new(element["value"], "input.#{formatter.format_class(element["class"])}[value='#{element["value"]}']")
12
+ end
13
+ end
14
+ end
15
+ end
16
+ elements
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,33 @@
1
+ module Swamp
2
+ class Interface
3
+
4
+ WELCOME_MESSAGE = ['Enter the url for the page to be scanned:']
5
+ INVALID_REQUEST_MESSAGE = ['Please enter a valid url!']
6
+
7
+ def initialize(output, wrapper)
8
+ @output = output
9
+ @wrapper = wrapper
10
+ end
11
+
12
+ def run
13
+ present(WELCOME_MESSAGE)
14
+ end
15
+
16
+ def scan(input)
17
+ evaluator = Swamp::Evaluator.new(input, @wrapper)
18
+ messages = (evaluator.valid_url? or evaluator.refresh_command?) ? request(input) : INVALID_REQUEST_MESSAGE
19
+ present messages
20
+ end
21
+
22
+ def request(input)
23
+ @wrapper.explore(input)
24
+ @wrapper.scan
25
+ end
26
+
27
+ def present(messages)
28
+ messages.each do |message|
29
+ @output.puts(message)
30
+ end
31
+ end
32
+ end
33
+ end
data/lib/swamp/link.rb ADDED
@@ -0,0 +1,11 @@
1
+ module Swamp
2
+ class Link < Element
3
+ def method_signature
4
+ format(@name)
5
+ end
6
+
7
+ def accessor
8
+ "click_link(\"#{@selector}\")"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ module Swamp
2
+ class Links < Elements
3
+ def get
4
+ elements = []
5
+ page.all('a[href]').map do | element |
6
+ if element.visible?
7
+ if has_id?(element)
8
+ elements << Swamp::Link.new(element["id"], element["id"])
9
+ end
10
+ end
11
+ end
12
+ elements
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ module Swamp
2
+ class SelectBox < Element
3
+ def method_signature
4
+ "select_#{format(@name)}(option)"
5
+ end
6
+
7
+ def accessor
8
+ "select(option, :from => \"#{@selector}\")"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ module Swamp
2
+ class SelectBoxes < Elements
3
+ def get
4
+ elements = []
5
+ page.all('select').map do | element |
6
+ if element.visible?
7
+ if has_id?(element)
8
+ elements << Swamp::SelectBox.new(element["id"], element["id"])
9
+ elsif has_name?(element)
10
+ elements << Swamp::SelectBox.new(element["name"], element["name"])
11
+ end
12
+ end
13
+ end
14
+ elements
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module Swamp
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,25 @@
1
+ module Swamp
2
+ class Wrapper < Base
3
+ def initialize(meta_collection)
4
+ @meta_collection = meta_collection
5
+ @page_visited = false
6
+ end
7
+
8
+ attr_reader :page_visited
9
+
10
+ def explore(url)
11
+ if !page_visited
12
+ visit url
13
+ @page_visited = true
14
+ end
15
+ end
16
+
17
+ def scan
18
+ found_snippets = []
19
+ @meta_collection.each do | element_collection |
20
+ found_snippets += element_collection.get.map { | element | Swamp::Builder.new(element).build_snippet }
21
+ end
22
+ found_snippets
23
+ end
24
+ end
25
+ end
data/lib/swamp.rb ADDED
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler.setup(:default)
4
+
5
+ require 'swamp/version'
6
+ require 'swamp/interface'
7
+ require 'swamp/evaluator'
8
+ require 'swamp/base'
9
+ require 'swamp/elements'
10
+ require 'swamp/wrapper'
11
+ require 'swamp/element'
12
+ require 'swamp/fields'
13
+ require 'swamp/field'
14
+ require 'swamp/buttons'
15
+ require 'swamp/button'
16
+ require 'swamp/builder'
17
+ require 'swamp/formatter'
18
+ require 'swamp/input_buttons'
19
+ require 'swamp/input_button'
20
+ require 'swamp/select_boxes'
21
+ require 'swamp/select_box'
22
+ require 'swamp/links'
23
+ require 'swamp/link'
24
+
25
+ module Swamp
26
+ end
@@ -0,0 +1,12 @@
1
+ require 'swamp'
2
+
3
+ RSpec.configure do |config|
4
+ # Use color in STDOUT
5
+ config.color_enabled = true
6
+
7
+ # Use color not only in STDOUT but also in pagers and files
8
+ #config.tty = true
9
+
10
+ # Use the specified formatter
11
+ #config.formatter = :documentation # :progress, :html, :textmate
12
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ module Swamp
3
+ describe Builder do
4
+ describe "#build_method" do
5
+ context "when the type is field" do
6
+ let(:type) { :field }
7
+ context "when the name and the selector are present" do
8
+ it "returns the method's snippet" do
9
+ element = Swamp::Field.new("User-Name", "User-Name")
10
+ builder = Swamp::Builder.new(element)
11
+ builder.build_snippet.should == "def type_user_name(input)\n source.fill_in(\"User-Name\", with: input)\nend"
12
+ end
13
+ end
14
+ end
15
+
16
+ context "when the type is button" do
17
+ let(:type) { :button }
18
+ context "when the name and the selector are present" do
19
+ it "returns the method's snippet" do
20
+ element = Swamp::Button.new("Log_in", "Log_in")
21
+ builder = Swamp::Builder.new(element)
22
+ builder.build_snippet.should == "def log_in\n source.click_button(\"Log_in\")\nend"
23
+ end
24
+ end
25
+
26
+ context "when just the selector is present" do
27
+ it "returns just the selector snippet" do
28
+ element = Swamp::Button.new(nil, "$ 9.90 Buy")
29
+ builder = Swamp::Builder.new(element)
30
+ builder.build_snippet.should == "source.click_button(\"$ 9.90 Buy\")"
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,93 @@
1
+ require 'spec_helper'
2
+ module Swamp
3
+ describe Buttons do
4
+ let(:buttons) { buttons = Swamp::Buttons.new }
5
+
6
+ it "delegates to capybara the responsibility to get the buttons" do
7
+ element = {'id' => "u_0_2"}
8
+ element.stub(:text).and_return("Sign Up")
9
+ element.stub(:visible?).and_return(true)
10
+ buttons.page.should_receive(:all).with('button').and_return([element])
11
+ buttons.get
12
+ end
13
+
14
+ context "when the element is visible" do
15
+ context "when the button element has text" do
16
+ let(:element) { {'id' => "u_0_2"} }
17
+
18
+ before(:each) do
19
+ element.stub(:visible?).and_return(true)
20
+ element.stub(:text).and_return("Sign Up")
21
+ buttons.page.stub(:all).with('button').and_return([element])
22
+ end
23
+
24
+ it "returns the element in the array using the text as both the name and the selector" do
25
+ buttons.get.should have(1).button
26
+ buttons.get.each.first.name.should == "Sign Up"
27
+ buttons.get.each.first.selector.should == "Sign Up"
28
+ end
29
+ end
30
+
31
+ context "when the button element has no text" do
32
+ context "when the button element has id" do
33
+ let(:element) { {'id' => "search-button"} }
34
+
35
+ before(:each) do
36
+ element.stub(:visible?).and_return(true)
37
+ element.stub(:text).and_return("")
38
+ buttons.page.stub(:all).with('button').and_return([element])
39
+ end
40
+
41
+ it "returns the element in the array using the id as both the name and the selector" do
42
+ buttons.get.should have(1).button
43
+ buttons.get.each.first.name.should == "search-button"
44
+ buttons.get.each.first.selector.should == "search-button"
45
+ end
46
+ end
47
+
48
+ context "when the button element has no id" do
49
+ context "when the button element has value" do
50
+ let(:element) { {'value' => "search-button", 'id' => ""} }
51
+
52
+ before(:each) do
53
+ element.stub(:visible?).and_return(true)
54
+ element.stub(:text).and_return("")
55
+ buttons.page.stub(:all).with('button').and_return([element])
56
+ end
57
+
58
+ it "returns the element in the array using the value as both the name and the selector" do
59
+ buttons.get.should have(1).button
60
+ buttons.get.each.first.name.should == "search-button"
61
+ buttons.get.each.first.selector.should == "search-button"
62
+ end
63
+ end
64
+
65
+ context "when the button element has no value" do
66
+ let(:element) { {'value' => "", 'id' => ""} }
67
+
68
+ before(:each) do
69
+ element.stub(:visible?).and_return(true)
70
+ element.stub(:text).and_return("")
71
+ buttons.page.stub(:all).with('button').and_return([element])
72
+ end
73
+
74
+ it "returns an empty array" do
75
+ buttons.stub(:all).with('button').and_return([element])
76
+ buttons.get.should == []
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ context "when the button element is not visible" do
84
+ it "returns an empty array" do
85
+ element = {'id' => "u_0_2"}
86
+ element.stub(:text).and_return("Sign Up")
87
+ element.stub(:visible?).and_return(false)
88
+ buttons.page.stub(:all).with('button').and_return([element])
89
+ buttons.get.should == []
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+ module Swamp
3
+ describe Evaluator do
4
+ let(:wrapper) { wrapper = double('wrapper').as_null_object }
5
+
6
+ describe "#valid_url?" do
7
+ context "when the url is valid" do
8
+ context "when it starts with 'http://'" do
9
+ it "returns true" do
10
+ input = "http://fakepage.com"
11
+ evaluator = Swamp::Evaluator.new(input, wrapper)
12
+ evaluator.should be_valid_url
13
+ end
14
+ end
15
+
16
+ context "when it starts with 'https://'" do
17
+ it "returns true" do
18
+ input = "https://fakepage.com"
19
+ evaluator = Swamp::Evaluator.new(input, wrapper)
20
+ evaluator.should be_valid_url
21
+ end
22
+ end
23
+
24
+ context "when it starts with 'file://'" do
25
+ it "returns true" do
26
+ input = "file://fakepage.html"
27
+ evaluator = Swamp::Evaluator.new(input, wrapper)
28
+ evaluator.should be_valid_url
29
+ end
30
+ end
31
+ end
32
+
33
+ context "when the url is invalid" do
34
+ context "when the protocol prefix is missing" do
35
+ it "returns false" do
36
+ input = "www.fakepage.com"
37
+ evaluator = Swamp::Evaluator.new(input, wrapper)
38
+ evaluator.should_not be_valid_url
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ describe "#refresh_command?" do
45
+ context "when the input is an enter keystroke" do
46
+ context "when a page was already visited" do
47
+ it "returns true" do
48
+ wrapper.stub(:page_visited).and_return(true)
49
+ input = "\n"
50
+ evaluator = Swamp::Evaluator.new(input, wrapper)
51
+ evaluator.should be_refresh_command
52
+ end
53
+ end
54
+
55
+ context "when no page was yet visited" do
56
+ it "returns false" do
57
+ wrapper.stub(:page_visited).and_return(false)
58
+ input = "\n"
59
+ evaluator = Swamp::Evaluator.new(input, wrapper)
60
+ evaluator.should_not be_refresh_command
61
+ end
62
+ end
63
+ end
64
+
65
+ context "when the input is not an enter keystroke" do
66
+ it "returns false" do
67
+ wrapper.stub(:page_visited).and_return(true)
68
+ input = " "
69
+ evaluator = Swamp::Evaluator.new(input, wrapper)
70
+ evaluator.should_not be_refresh_command
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+ module Swamp
3
+ describe Fields do
4
+ let(:fields) { Swamp::Fields.new }
5
+
6
+ it "delegates to capybara the responsibility to get the fields" do
7
+ element = {'name' => "username", 'type' => "text"}
8
+ element.stub(:visible?).and_return(true)
9
+ fields.page.should_receive(:all).with('input').and_return([element])
10
+ fields.get
11
+ end
12
+
13
+ context "when the input element is visible" do
14
+ context "when the name attribute is present" do
15
+ context "when it has the id attribute" do
16
+ it "returns the element in the array using the name as the name and the id as the selector" do
17
+ element = {'name' => "username", 'type' => "text", 'id' => "u_0_b"}
18
+ element.stub(:visible?).and_return(true)
19
+ fields.page.stub(:all).with('input').and_return([element])
20
+ fields.get.should have(1).field
21
+ fields.get.first.name.should == "username"
22
+ fields.get.first.selector.should == "u_0_b"
23
+ end
24
+ end
25
+
26
+ context "when its type is text" do
27
+ it "returns the element in the array" do
28
+ element = {'name' => "username", 'type' => "text"}
29
+ element.stub(:visible?).and_return(true)
30
+ fields.page.stub(:all).with('input').and_return([element])
31
+ fields.get.should have(1).field
32
+ fields.get.first.name.should == "username"
33
+ fields.get.first.selector.should == "username"
34
+ end
35
+ end
36
+
37
+ context "when its type is email" do
38
+ it "returns the element in the array" do
39
+ element = {'name' => "useremail", 'type' => "email"}
40
+ element.stub(:visible?).and_return(true)
41
+ fields.page.stub(:all).with('input').and_return([element])
42
+ fields.get.should have(1).field
43
+ fields.get.first.name.should == "useremail"
44
+ fields.get.first.selector.should == "useremail"
45
+ end
46
+ end
47
+
48
+ context "when its type is password" do
49
+ it "returns the element in the array" do
50
+ element = {'name' => "password", 'type' => "password"}
51
+ element.stub(:visible?).and_return(true)
52
+ fields.page.stub(:all).with('input').and_return([element])
53
+ fields.get.should have(1).field
54
+ fields.get.first.name.should == "password"
55
+ fields.get.first.selector.should == "password"
56
+ end
57
+ end
58
+
59
+ context "when the input element type is invalid" do
60
+ it "returns an empty array" do
61
+ element = {'name' => "username", 'type' => "radio"}
62
+ element.stub(:visible?).and_return(true)
63
+ fields.page.stub(:all).with('input').and_return([element])
64
+ fields.get.should == []
65
+ end
66
+ end
67
+ end
68
+
69
+ context "when the input element has no name attribute" do
70
+ it "returns an empty array" do
71
+ element = {'name' => "", 'type' => "text"}
72
+ element.stub(:visible?).and_return(true)
73
+ fields.page.stub(:all).with('input').and_return([element])
74
+ fields.get.should == []
75
+ end
76
+ end
77
+ end
78
+
79
+ context "when the input element is not visible" do
80
+ it "returns an empty array" do
81
+ element = {'name' => "username", 'type' => "text"}
82
+ element.stub(:visible?).and_return(false)
83
+ fields.page.stub(:all).with('input').and_return([element])
84
+ fields.get.should == []
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+ module Swamp
3
+ describe Formatter do
4
+ let(:formatter) { formatter = Swamp::Formatter.new }
5
+
6
+ describe "#format" do
7
+ context "when the name has dashes" do
8
+ it "replaces the dashes with unsderscores" do
9
+ name = "user-name"
10
+ formatter.format(name).should == "user_name"
11
+ end
12
+ end
13
+
14
+ context "when the name has white spaces" do
15
+ it "replaces the white spaces with underscores" do
16
+ name = "user name"
17
+ formatter.format(name).should == "user_name"
18
+ end
19
+ end
20
+
21
+ context "when the name has underscore in the end" do
22
+ it "removes the underscores from the end" do
23
+ name = "user_name_"
24
+ formatter.format(name).should == "user_name"
25
+ end
26
+ end
27
+
28
+ context "when the name has uppercase characters" do
29
+ it "converts the characters to lowercase" do
30
+ name = "Sign up"
31
+ formatter.format(name).should == "sign_up"
32
+ end
33
+ end
34
+
35
+ context "when the name has parentheses" do
36
+ it "replace the parentheses with underscores" do
37
+ name = "user_name(title)"
38
+ formatter.format(name).should == "user_name_title"
39
+ end
40
+ end
41
+
42
+ context "when the name has brackets" do
43
+ it "replace the brackets with underscores" do
44
+ name = "user_name[title]"
45
+ formatter.format(name).should == "user_name_title"
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "#format_class" do
51
+ context "when the class has white spaces" do
52
+ it "replaces the white spaces with dots" do
53
+ class_name = "button g-button g-button-submit"
54
+ formatter.format_class(class_name).should == "button.g-button.g-button-submit"
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end