Skip to content

Commit

Permalink
Create base class for web forms and cwc forms
Browse files Browse the repository at this point in the history
  • Loading branch information
wioux committed Oct 5, 2018
1 parent ee7e8e6 commit b30d10e
Show file tree
Hide file tree
Showing 6 changed files with 120 additions and 113 deletions.
1 change: 1 addition & 0 deletions lib/congress_forms.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ module CongressForms
Error = Class.new(Exception)

autoload :Form, "congress_forms/form"
autoload :WebForm, "congress_forms/web_form"
autoload :CwcForm, "congress_forms/cwc_form"
autoload :Actions, "congress_forms/actions"

Expand Down
70 changes: 1 addition & 69 deletions lib/congress_forms/form.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
module CongressForms
class Form
attr_accessor :bioguide, :actions
attr_accessor :success_status, :success_content
attr_accessor :updated_at

@@repo = nil

def self.repo
Expand All @@ -18,74 +14,10 @@ def self.find(bioguide)
if Cwc::Client.new.office_supported?(bioguide)
CwcForm.new(bioguide)
else
parse(repo.find("members/#{bioguide}.yaml"))
WebForm.parse(repo.find("members/#{bioguide}.yaml"))
end
rescue Errno::ENOENT => e
nil
end

def self.parse(file)
yaml = YAML.load_file(file)

actions = yaml.dig("contact_form", "steps").map do |step|
Actions.build(step)
end.flatten

new(
actions,
bioguide: yaml["bioguide"],
success_status:
yaml.dig("contact_form", "success", "headers", "status"),
success_content:
yaml.dig("contact_form", "success", "body", "contains"),
updated_at: File.mtime(file)
)
end

def self.create_browser
if ENV["HEADLESS"] == "0"
Capybara::Session.new(:chrome)
else
Capybara::Session.new(:headless_chrome)
end.tap do |browser|
browser.current_window.resize_to(1920, 1080)
end
end

def initialize(actions = [], bioguide: nil,
success_status: nil,
success_content: nil,
updated_at: nil)
self.bioguide = bioguide
self.actions = actions
self.success_status = success_status
self.success_content = success_content
self.updated_at = updated_at
end

def required_params
required_actions = actions.dup

required_actions.select!(&:required?)
required_actions.select!(&:placeholder_value?)

required_actions.map do |action|
{
value: action.value,
max_length: action.max_length,
options: action.select_options
}
end
end

def fill(values, browser: self.class.create_browser, submit: true)
actions.each do |action|
break if action.submit? && !submit

action.perform(browser, values)
end
rescue Capybara::CapybaraError => e
raise Error, e.message
end
end
end
71 changes: 71 additions & 0 deletions lib/congress_forms/web_form.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
module CongressForms
class WebForm < Form
attr_accessor :bioguide, :actions
attr_accessor :success_status, :success_content
attr_accessor :updated_at

def self.parse(file)
yaml = YAML.load_file(file)

actions = yaml.dig("contact_form", "steps").map do |step|
Actions.build(step)
end.flatten

new(
actions,
bioguide: yaml["bioguide"],
success_status:
yaml.dig("contact_form", "success", "headers", "status"),
success_content:
yaml.dig("contact_form", "success", "body", "contains"),
updated_at: File.mtime(file)
)
end

def self.create_browser
if ENV["HEADLESS"] == "0"
Capybara::Session.new(:chrome)
else
Capybara::Session.new(:headless_chrome)
end.tap do |browser|
browser.current_window.resize_to(1920, 1080)
end
end

def initialize(actions = [], bioguide: nil,
success_status: nil,
success_content: nil,
updated_at: nil)
self.bioguide = bioguide
self.actions = actions
self.success_status = success_status
self.success_content = success_content
self.updated_at = updated_at
end

def required_params
required_actions = actions.dup

required_actions.select!(&:required?)
required_actions.select!(&:placeholder_value?)

required_actions.map do |action|
{
value: action.value,
max_length: action.max_length,
options: action.select_options
}
end
end

def fill(values, browser: self.class.create_browser, submit: true)
actions.each do |action|
break if action.submit? && !submit

action.perform(browser, values)
end
rescue Capybara::CapybaraError => e
raise Error, e.message
end
end
end
2 changes: 1 addition & 1 deletion spec/congress_forms/actions_spec.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
require "spec_helper"

describe CongressForms::Actions do
let(:browser) { CongressForms::Form.create_browser }
let(:browser) { CongressForms::WebForm.create_browser }

before do
if defined?(page)
Expand Down
44 changes: 1 addition & 43 deletions spec/congress_forms/form_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
with("members/#{bioguide}.yaml").
and_return(file)

expect(CongressForms::Form).
expect(CongressForms::WebForm).
to receive(:parse).
with(file).
and_return(form)
Expand All @@ -45,46 +45,4 @@
end
end
end

describe ".parse" do
it "should build a Form from the yaml definition" do
file, step, action = double, double, double
yaml = {
"bioguide" => double,
"contact_form" => {
"steps" => [step],
"success" => {
"headers" => { "status" => double },
"body" => { "contains" => double }
}
}
}

expect(YAML).
to receive(:load_file).with(file).and_return(yaml)
expect(CongressForms::Actions).
to receive(:build).with(step).and_return(action)
expect(File).to receive(:mtime).with(file).and_return(Time.now)

form = CongressForms::Form.parse(file)
expect(form.bioguide).to eq(yaml["bioguide"])
expect(form.actions).to eq([action])
expect(form.success_status).
to eq(yaml.dig("contact_form", "success", "headers", "status"))
expect(form.success_content).
to eq(yaml.dig("contact_form", "success", "body", "contains"))
end
end

pending "#required_params"

describe "#fill(values, browser:)" do
it "should call #perform(browser, values) on each action" do
values, browser = double, double
actions = [double, double].map(&:as_null_object)
expect(actions[0]).to receive(:perform).with(browser, values)
expect(actions[1]).to receive(:perform).with(browser, values)
CongressForms::Form.new(actions).fill(values, browser: browser)
end
end
end
45 changes: 45 additions & 0 deletions spec/congress_forms/web_form_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
require "spec_helper"

describe CongressForms::WebForm do
describe ".parse" do
it "should build a Form from the yaml definition" do
file, step, action = double, double, double
yaml = {
"bioguide" => double,
"contact_form" => {
"steps" => [step],
"success" => {
"headers" => { "status" => double },
"body" => { "contains" => double }
}
}
}

expect(YAML).
to receive(:load_file).with(file).and_return(yaml)
expect(CongressForms::Actions).
to receive(:build).with(step).and_return(action)
expect(File).to receive(:mtime).with(file).and_return(Time.now)

form = CongressForms::WebForm.parse(file)
expect(form.bioguide).to eq(yaml["bioguide"])
expect(form.actions).to eq([action])
expect(form.success_status).
to eq(yaml.dig("contact_form", "success", "headers", "status"))
expect(form.success_content).
to eq(yaml.dig("contact_form", "success", "body", "contains"))
end
end

pending "#required_params"

describe "#fill(values, browser:)" do
it "should call #perform(browser, values) on each action" do
values, browser = double, double
actions = [double, double].map(&:as_null_object)
expect(actions[0]).to receive(:perform).with(browser, values)
expect(actions[1]).to receive(:perform).with(browser, values)
CongressForms::WebForm.new(actions).fill(values, browser: browser)
end
end
end

0 comments on commit b30d10e

Please sign in to comment.