conformity 0.0.4 → 0.0.5
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.
- checksums.yaml +4 -4
- data/lib/conformity/actions.rb +38 -0
- data/lib/conformity/field.rb +28 -2
- data/lib/conformity/form.rb +9 -25
- data/lib/conformity/version.rb +1 -1
- data/lib/conformity.rb +14 -1
- data/spec/actions_spec.rb +74 -0
- data/spec/field_spec.rb +32 -0
- data/spec/form_spec.rb +16 -37
- metadata +5 -5
- data/lib/conformity/action.rb +0 -37
- data/spec/action_spec.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01f3786cd9944fbc1a8275c48afcc2dc9128ea83
|
4
|
+
data.tar.gz: f0d8722c3d724f21c3bb712e34057911a7bd6f3a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ec8f708b330e8cb8d75d8e856f9f1b766e97cb2780cf73458c639a577153a299e9a75f7b153098e92a86ee90dbdd58debee712e3ad55e143a31d7add4354a13
|
7
|
+
data.tar.gz: 643358251d8989f885d6cd189d0ad5fda13402fd3f548420a4bfedb3c17ab2dd66dd24d1b30bf9452f2cf431e013e4379297c5aefc398891df9e886533232396
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Conformity
|
2
|
+
class Actions
|
3
|
+
attr_reader :session
|
4
|
+
|
5
|
+
ACTIONS = [:visit, :find, :fill_in, :select, :check, :uncheck, :choose,
|
6
|
+
:click_on, :wait]
|
7
|
+
|
8
|
+
def initialize(session = Capybara.current_session)
|
9
|
+
@session = session
|
10
|
+
end
|
11
|
+
|
12
|
+
def field(name, options={})
|
13
|
+
Field.value(name)
|
14
|
+
end
|
15
|
+
|
16
|
+
def method_missing(name, *args, &block)
|
17
|
+
if ACTIONS.include?(name)
|
18
|
+
session.send(name, *args, &block)
|
19
|
+
screenshot(name) if Conformity.log_screenshots
|
20
|
+
|
21
|
+
# ignore SuccessConditions
|
22
|
+
elsif [:has_status_code?, :has_content?]
|
23
|
+
else super
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# so Kernel#select isn't called
|
28
|
+
def select(*args, &block)
|
29
|
+
session.send(:select, *args, &block)
|
30
|
+
end
|
31
|
+
|
32
|
+
def screenshot(name)
|
33
|
+
file_name = "#{Time.now.to_i}_#{name}.png"
|
34
|
+
full_path = Conformity.screenshots_folder + "/" + file_name
|
35
|
+
session.send(:save_screenshot, full_path)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/conformity/field.rb
CHANGED
@@ -1,13 +1,31 @@
|
|
1
1
|
module Conformity
|
2
2
|
class Field
|
3
|
-
attr_reader :name
|
4
|
-
attr_writer :value
|
3
|
+
attr_reader :name, :options
|
5
4
|
attr_accessor :type
|
6
5
|
|
6
|
+
class << self
|
7
|
+
def find(name)
|
8
|
+
fields[name]
|
9
|
+
end
|
10
|
+
|
11
|
+
def value(name)
|
12
|
+
find(name).value
|
13
|
+
end
|
14
|
+
|
15
|
+
def fields
|
16
|
+
@fields ||= {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_field(field)
|
20
|
+
fields[field.name] = field
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
7
24
|
def initialize(name, options = {})
|
8
25
|
@name = name
|
9
26
|
@options = options[:options]
|
10
27
|
@required = options[:required] || false
|
28
|
+
self.class.add_field(self)
|
11
29
|
end
|
12
30
|
|
13
31
|
def required?
|
@@ -21,5 +39,13 @@ module Conformity
|
|
21
39
|
raise FieldError, "Required field '#{name}' not set"
|
22
40
|
end
|
23
41
|
end
|
42
|
+
|
43
|
+
def value=(value)
|
44
|
+
if @options && !@options.include?(value)
|
45
|
+
raise FieldError, "#{value} not in #{@options}"
|
46
|
+
end
|
47
|
+
|
48
|
+
@value = value
|
49
|
+
end
|
24
50
|
end
|
25
51
|
end
|
data/lib/conformity/form.rb
CHANGED
@@ -2,8 +2,7 @@ module Conformity
|
|
2
2
|
class Form
|
3
3
|
extend Forwardable
|
4
4
|
|
5
|
-
|
6
|
-
:click_on, :wait]
|
5
|
+
attr_reader :actions, :block, :success_conditions
|
7
6
|
|
8
7
|
def_delegators :@success_conditions, :has_content?, :has_status_code?,
|
9
8
|
:success?
|
@@ -11,7 +10,9 @@ module Conformity
|
|
11
10
|
def initialize(host = '', &block)
|
12
11
|
set_host(host)
|
13
12
|
@success_conditions = SuccessConditions.new(Capybara.current_session)
|
14
|
-
|
13
|
+
@actions = Actions.new
|
14
|
+
@block = block
|
15
|
+
instance_eval(&block)
|
15
16
|
end
|
16
17
|
|
17
18
|
def set_host(host)
|
@@ -35,7 +36,7 @@ module Conformity
|
|
35
36
|
Capybara.current_session.reset!
|
36
37
|
|
37
38
|
begin
|
38
|
-
actions.
|
39
|
+
actions.instance_eval(&block)
|
39
40
|
rescue => e
|
40
41
|
raise FillError, "#{e.message}"
|
41
42
|
end
|
@@ -49,29 +50,12 @@ module Conformity
|
|
49
50
|
end
|
50
51
|
|
51
52
|
def method_missing(name, *args, &block)
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
case action.name
|
56
|
-
when :fill_in then action.field.type = :text
|
57
|
-
when :choose then action.field.type = :radio
|
58
|
-
when :select then action.field.type = :select
|
59
|
-
end
|
60
|
-
|
61
|
-
actions << action
|
62
|
-
else
|
63
|
-
super
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# When passing a block to iniatialize using instance_eval the Kernel#select
|
68
|
-
# method gets called instead of method_missing
|
69
|
-
def select(*args, &block)
|
70
|
-
method_missing(:select, *args, &block)
|
53
|
+
# ignore actions
|
54
|
+
super unless Actions::ACTIONS.include?(name)
|
71
55
|
end
|
72
56
|
|
73
|
-
|
74
|
-
|
57
|
+
# so Kernel#select isn't called
|
58
|
+
def select(*args)
|
75
59
|
end
|
76
60
|
end
|
77
61
|
end
|
data/lib/conformity/version.rb
CHANGED
data/lib/conformity.rb
CHANGED
@@ -8,7 +8,7 @@ rescue Gem::LoadError
|
|
8
8
|
poltergeist = false
|
9
9
|
end
|
10
10
|
|
11
|
-
require 'conformity/
|
11
|
+
require 'conformity/actions'
|
12
12
|
require 'conformity/form'
|
13
13
|
require 'conformity/field'
|
14
14
|
require 'conformity/success_conditions'
|
@@ -18,6 +18,19 @@ module Conformity
|
|
18
18
|
class ActionError < ConformityError; end
|
19
19
|
class FieldError < ConformityError; end
|
20
20
|
class FillError < ConformityError; end
|
21
|
+
|
22
|
+
class << self
|
23
|
+
attr_writer :log_screenshots
|
24
|
+
attr_accessor :screenshots_folder
|
25
|
+
|
26
|
+
def configure
|
27
|
+
yield self
|
28
|
+
end
|
29
|
+
|
30
|
+
def log_screenshots
|
31
|
+
@log_screenshots ||= false
|
32
|
+
end
|
33
|
+
end
|
21
34
|
end
|
22
35
|
|
23
36
|
Capybara.configure do |config|
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
require 'capybara'
|
3
|
+
require 'conformity/actions'
|
4
|
+
|
5
|
+
|
6
|
+
include Conformity
|
7
|
+
describe Conformity::Actions do
|
8
|
+
before :each do
|
9
|
+
@field = double('field', value: 'quack')
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#field" do
|
13
|
+
it "get's the value of the field" do
|
14
|
+
actions = Actions.new
|
15
|
+
|
16
|
+
allow(Field).to receive(:value).with(:name) { "Jane Doe" }
|
17
|
+
|
18
|
+
expect(actions.field(:name)).to match("Jane Doe")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#method_missing" do
|
23
|
+
it "delegates action calls to session" do
|
24
|
+
session = double
|
25
|
+
actions = Actions.new(session)
|
26
|
+
|
27
|
+
expect(session).to receive(:visit).with("/")
|
28
|
+
actions.visit('/')
|
29
|
+
end
|
30
|
+
|
31
|
+
it "ignores success conditions" do
|
32
|
+
session = double
|
33
|
+
actions = Actions.new(session)
|
34
|
+
|
35
|
+
expect { actions.has_status_code?; actions.has_content? }.to_not raise_error
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#select" do
|
40
|
+
it "is called on session" do
|
41
|
+
session = double
|
42
|
+
actions = Actions.new(session)
|
43
|
+
|
44
|
+
expect(session).to receive(:select)
|
45
|
+
actions.select('Yes')
|
46
|
+
end
|
47
|
+
|
48
|
+
it "is not called on Kernel" do
|
49
|
+
skip "not sure how to test"
|
50
|
+
session = double
|
51
|
+
actions = Actions.new(session)
|
52
|
+
|
53
|
+
expect(Kernel).to_not receive(:select)
|
54
|
+
actions.select('Yes')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "logging" do
|
59
|
+
it "calls session to save a screenshot" do
|
60
|
+
session = double
|
61
|
+
Conformity.configure do |c|
|
62
|
+
c.log_screenshots = true
|
63
|
+
c.screenshots_folder = "."
|
64
|
+
end
|
65
|
+
|
66
|
+
allow(Time).to receive(:now) { 0 }
|
67
|
+
allow(session).to receive(:visit)
|
68
|
+
expect(session).to receive(:save_screenshot).with("./0_visit.png")
|
69
|
+
|
70
|
+
actions = Actions.new(session)
|
71
|
+
actions.visit('/')
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/spec/field_spec.rb
CHANGED
@@ -26,6 +26,19 @@ describe Conformity::Field do
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
+
describe "#value=" do
|
30
|
+
it "sets the value" do
|
31
|
+
field = Field.new(:boolean, options: ["true", "false"])
|
32
|
+
field.value = "true"
|
33
|
+
expect(field.value).to match("true")
|
34
|
+
end
|
35
|
+
|
36
|
+
it "if options are given it raises an error when trying to set a value not in options" do
|
37
|
+
field = Field.new(:field, options: ["one", "two", "three"])
|
38
|
+
expect { field.value = "four" }.to raise_error(Conformity::FieldError)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
29
42
|
describe "#required?" do
|
30
43
|
it "returns true if a field is required" do
|
31
44
|
field = Field.new(:field, required: true)
|
@@ -37,4 +50,23 @@ describe Conformity::Field do
|
|
37
50
|
expect(field.required?).to be_falsey
|
38
51
|
end
|
39
52
|
end
|
53
|
+
|
54
|
+
describe ".find" do
|
55
|
+
it "returns a field with the given name" do
|
56
|
+
to_find = Field.new(:a)
|
57
|
+
Field.new(:b)
|
58
|
+
Field.new(:c)
|
59
|
+
|
60
|
+
expect(Field.find(:a)).to be(to_find)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe ".value" do
|
65
|
+
it "returns the value for a field with name" do
|
66
|
+
field = Field.new(:field)
|
67
|
+
field.value = "blue"
|
68
|
+
|
69
|
+
expect(Field.value(:field)).to match("blue")
|
70
|
+
end
|
71
|
+
end
|
40
72
|
end
|
data/spec/form_spec.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
require_relative 'spec_helper'
|
2
2
|
require 'conformity/form'
|
3
|
+
require 'pry'
|
3
4
|
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
include Conformity
|
7
|
+
describe Form do
|
8
|
+
before :each do
|
9
|
+
@form = Form.new { } # no actions for test
|
10
|
+
end
|
10
11
|
describe '#initialize' do
|
11
|
-
it
|
12
|
+
it "initializes with a block" do
|
12
13
|
expect do
|
13
14
|
Form.new do
|
14
15
|
visit '/page'
|
@@ -22,6 +23,10 @@ describe Conformity::Form do
|
|
22
23
|
end
|
23
24
|
end.to_not raise_error
|
24
25
|
end
|
26
|
+
|
27
|
+
it "raises an error when not given a block" do
|
28
|
+
expect { Form.new }.to raise_error
|
29
|
+
end
|
25
30
|
end
|
26
31
|
|
27
32
|
describe '#field' do
|
@@ -56,8 +61,8 @@ describe Conformity::Form do
|
|
56
61
|
end
|
57
62
|
|
58
63
|
describe '#fill' do
|
59
|
-
it
|
60
|
-
skip "
|
64
|
+
it "delegates to actions" do
|
65
|
+
skip "test not implemented"
|
61
66
|
end
|
62
67
|
|
63
68
|
it 'raises FillError on failure' do
|
@@ -70,35 +75,9 @@ describe Conformity::Form do
|
|
70
75
|
end
|
71
76
|
end
|
72
77
|
|
73
|
-
describe
|
74
|
-
it
|
75
|
-
@form.fill_in "
|
76
|
-
expect(Capybara::DSL).to_not receive(:fill_in)
|
77
|
-
end
|
78
|
-
|
79
|
-
describe 'field types' do
|
80
|
-
it 'sets the field type for fill_in' do
|
81
|
-
field = double
|
82
|
-
expect(field).to receive(:type=).with(:text)
|
83
|
-
|
84
|
-
@form.fill_in :name, with: field
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'sets the field type for choose' do
|
88
|
-
field = double
|
89
|
-
expect(field).to receive(:type=).with(:radio)
|
90
|
-
|
91
|
-
@form.choose field
|
92
|
-
end
|
93
|
-
|
94
|
-
# this tests fails and I don't know why! (rspec's fault not mine.. I think)
|
95
|
-
it 'sets the field type for select' do
|
96
|
-
skip "RSpec's fault"
|
97
|
-
field = double
|
98
|
-
expect(field).to receive(:type=).with(:select)
|
99
|
-
|
100
|
-
@form.select field
|
101
|
-
end
|
78
|
+
describe "#method_missing" do
|
79
|
+
it "ignores actions" do
|
80
|
+
expect { @form.fill_in "Name", with: @form.field(:name) }.to_not raise_error
|
102
81
|
end
|
103
82
|
end
|
104
83
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: conformity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nikias Kalpaxis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capybara
|
@@ -66,12 +66,12 @@ files:
|
|
66
66
|
- Rakefile
|
67
67
|
- conformity.gemspec
|
68
68
|
- lib/conformity.rb
|
69
|
-
- lib/conformity/
|
69
|
+
- lib/conformity/actions.rb
|
70
70
|
- lib/conformity/field.rb
|
71
71
|
- lib/conformity/form.rb
|
72
72
|
- lib/conformity/success_conditions.rb
|
73
73
|
- lib/conformity/version.rb
|
74
|
-
- spec/
|
74
|
+
- spec/actions_spec.rb
|
75
75
|
- spec/field_spec.rb
|
76
76
|
- spec/form_spec.rb
|
77
77
|
- spec/spec_helper.rb
|
@@ -101,7 +101,7 @@ signing_key:
|
|
101
101
|
specification_version: 4
|
102
102
|
summary: Automates form submissions by building upon Capybara.
|
103
103
|
test_files:
|
104
|
-
- spec/
|
104
|
+
- spec/actions_spec.rb
|
105
105
|
- spec/field_spec.rb
|
106
106
|
- spec/form_spec.rb
|
107
107
|
- spec/spec_helper.rb
|
data/lib/conformity/action.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
module Conformity
|
2
|
-
class Action
|
3
|
-
include Capybara::DSL
|
4
|
-
|
5
|
-
attr_reader :name, :args, :block
|
6
|
-
|
7
|
-
def initialize(name, args = [], block = nil)
|
8
|
-
@name = name
|
9
|
-
@args = args
|
10
|
-
@block = block
|
11
|
-
end
|
12
|
-
|
13
|
-
def field
|
14
|
-
@field ||= case name
|
15
|
-
when :fill_in then args.last[:with]
|
16
|
-
when :choose then args.first
|
17
|
-
when :select then args.first
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def run
|
22
|
-
case name
|
23
|
-
when :fill_in
|
24
|
-
return unless field.value
|
25
|
-
args.last[:with] = field.value
|
26
|
-
when :choose, :select
|
27
|
-
return unless field.value
|
28
|
-
args.first = field.value
|
29
|
-
end if field
|
30
|
-
|
31
|
-
result = send(name, *args, &block)
|
32
|
-
if !result && result['status'] == 'fail'
|
33
|
-
raise ActionError, "Capybara status: #{result}"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
data/spec/action_spec.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
require_relative 'spec_helper'
|
2
|
-
require 'conformity/action'
|
3
|
-
|
4
|
-
|
5
|
-
describe Conformity::Action do
|
6
|
-
before :each do
|
7
|
-
@field = double('field', value: 'quack')
|
8
|
-
end
|
9
|
-
|
10
|
-
describe '#field' do
|
11
|
-
it 'locates the field duck type for fill_in' do
|
12
|
-
action = Action.new(:fill_in, ['#name', with: @field])
|
13
|
-
|
14
|
-
expect(action.field).to respond_to(:value)
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'locates the field duck type for choose' do
|
18
|
-
action = Action.new(:choose, [@field])
|
19
|
-
|
20
|
-
expect(action.field).to respond_to(:value)
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'locates the field duck type for select' do
|
24
|
-
action = Action.new(:select, [@field])
|
25
|
-
|
26
|
-
expect(action.field).to respond_to(:value)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe '#run' do
|
31
|
-
it 'delegates to Capybara::DSL' do
|
32
|
-
skip
|
33
|
-
action = Action.new(:click_on, ['#submit'])
|
34
|
-
|
35
|
-
expect(Capybara::DSL).to receive(:check).with('#submit')
|
36
|
-
action.run
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|