spec/unit/lib/web/page_spec.rb in howitzer-2.0.0 vs spec/unit/lib/web/page_spec.rb in howitzer-2.0.1

- old
+ new

@@ -12,24 +12,38 @@ context 'when validate missing' do context 'when params present' do let(:url_value) { 'http://example.com/users/1' } subject { described_class.open(id: 1) } it do - expect(described_class).to receive(:expanded_url).with(id: 1) { url_value }.once.ordered + expect(described_class).to receive(:expanded_url).with({ id: 1 }, nil) { url_value }.once.ordered expect(Howitzer::Log).to receive(:info) .with("Open #{described_class} page by '#{url_value}' url").once.ordered expect(described_class).to receive(:retryable).ordered.once.and_call_original expect(session).to receive(:visit).with(url_value).once.ordered expect(described_class).to receive(:given).once.ordered { true } expect(subject).to eq(true) end end + context 'when custom processor specified' do + let(:custom_processor) { double } + let(:url_value) { 'http://example.com/users/1' } + subject { described_class.open(id: 1, url_processor: custom_processor) } + it do + expect(described_class).to receive(:expanded_url).with({ id: 1 }, custom_processor) { url_value }.once.ordered + expect(Howitzer::Log).to receive(:info) + .with("Open #{described_class} page by '#{url_value}' url").once.ordered + expect(described_class).to receive(:retryable).ordered.once.and_call_original + expect(session).to receive(:visit).with(url_value).once.ordered + expect(described_class).to receive(:given).once.ordered { true } + expect(subject).to eq(true) + end + end context 'when params missing' do let(:url_value) { 'http://example.com/users' } subject { described_class.open } it do - expect(described_class).to receive(:expanded_url).with({}) { url_value }.once.ordered + expect(described_class).to receive(:expanded_url).with({}, nil) { url_value }.once.ordered expect(Howitzer::Log).to receive(:info) .with("Open #{described_class} page by '#{url_value}' url").once.ordered expect(described_class).to receive(:retryable).ordered.once.and_call_original expect(session).to receive(:visit).with(url_value).once.ordered expect(described_class).to receive(:given).once.ordered { true } @@ -39,11 +53,11 @@ end context 'when validate: false' do let(:url_value) { 'http://example.com/users' } subject { described_class.open(validate: false) } it do - expect(described_class).to receive(:expanded_url).with({}) { url_value }.once.ordered + expect(described_class).to receive(:expanded_url).with({}, nil) { url_value }.once.ordered expect(Howitzer::Log).to receive(:info).with("Open #{described_class} page by '#{url_value}' url").once.ordered expect(described_class).to receive(:retryable).ordered.once.and_call_original expect(session).to receive(:visit).with(url_value).once.ordered expect(described_class).not_to receive(:given) expect(subject).to be_nil @@ -51,11 +65,11 @@ end context 'when validate: true with params' do let(:url_value) { 'http://example.com/users/1' } subject { described_class.open(validate: true, id: 1) } it do - expect(described_class).to receive(:expanded_url).with(id: 1) { url_value }.once.ordered + expect(described_class).to receive(:expanded_url).with({ id: 1 }, nil) { url_value }.once.ordered expect(Howitzer::Log).to receive(:info).with("Open #{described_class} page by '#{url_value}' url").once.ordered expect(described_class).to receive(:retryable).ordered.once.and_call_original expect(session).to receive(:visit).with(url_value).once.ordered expect(described_class).to receive(:given).once.ordered { true } expect(subject).to eq(true) @@ -160,45 +174,76 @@ Class.new(base_class) end let!(:child_class3) do Class.new(described_class) end - it { expect(described_class.send(:app_host)).to eq('http://login:pass@my.website.com') } - it { expect(base_class.send(:app_host)).to eq('https://base.com') } - it { expect(child_class1.send(:app_host)).to eq('https://child.com') } - it { expect(child_class2.send(:app_host)).to eq('https://base.com') } - it { expect(child_class3.send(:app_host)).to eq('http://login:pass@my.website.com') } + it { expect(described_class.send(:site_value)).to eq('http://login:pass@my.website.com') } + it { expect(base_class.send(:site_value)).to eq('https://base.com') } + it { expect(child_class1.send(:site_value)).to eq('https://child.com') } + it { expect(child_class2.send(:site_value)).to eq('https://base.com') } + it { expect(child_class3.send(:site_value)).to eq('http://login:pass@my.website.com') } it 'should be protected' do expect { described_class.site('http://example.com') }.to raise_error(NoMethodError) end end describe '.expanded_url' do - context 'when params present' do - subject { test_page.expanded_url(id: 1) } - context 'when page url specified' do - context 'when BlankPage' do - let(:test_page) { Howitzer::Web::BlankPage } - it { is_expected.to eq('about:blank') } - end - context 'when other page' do - let(:test_page) do - Class.new(described_class) do - site 'http://example.com' - path '/users{/id}' + context 'when default url processor' do + context 'when params present' do + subject { test_page.expanded_url(id: 1) } + context 'when page url specified' do + context 'when BlankPage' do + let(:test_page) { Howitzer::Web::BlankPage } + it { is_expected.to eq('about:blank') } + end + context 'when other page' do + let(:test_page) do + Class.new(described_class) do + site 'http://example.com' + path '/users{/id}' + end end + it { is_expected.to eq('http://example.com/users/1') } end - it { is_expected.to eq('http://example.com/users/1') } + context 'when root not specified' do + let(:test_page) do + Class.new(described_class) do + path '/users{/id}' + end + end + it { is_expected.to eq('http://login:pass@my.website.com/users/1') } + end end - context 'when root not specified' do - let(:test_page) do - Class.new(described_class) do - path '/users{/id}' + end + context 'when custom url processor' do + let(:test_page) do + Class.new(described_class) do + site 'http://example.com' + path '/users{/id}' + end + end + let(:custom_processor_class) do + Class.new do + def self.restore(_name, value) + value.tr('-', ' ') end + + def self.match(_name) + '.*' + end + + def self.validate(_name, value) + !(value =~ /^[\w ]+$/).nil? + end + + def self.transform(_name, value) + value.tr(' ', '+') + end end - it { is_expected.to eq('http://login:pass@my.website.com/users/1') } end + subject { test_page.expanded_url({ id: 'hello world' }, custom_processor_class) } + it { is_expected.to eq('http://example.com/users/hello+world') } end context 'when page url missing' do subject { described_class.expanded_url } it do expect { subject }.to raise_error( @@ -223,15 +268,20 @@ describe '.path' do subject { described_class.send(:path, value) } before { subject } context 'when value is number' do let(:value) { 1 } - it { expect(described_class.instance_variable_get(:@path_template)).to eq('1') } + it do + expect(described_class.send(:path_value)).to eql '1' + expect(described_class.private_methods(true)).to include(:path_value) + end end context 'when value is string' do let(:value) { '/users' } - it { expect(described_class.instance_variable_get(:@path_template)).to eq('/users') } + it do + expect(described_class.send(:path_value)).to eql '/users' + end end end describe '#initialize' do subject { described_class.send(:new) } @@ -255,24 +305,9 @@ end end describe 'inherited callback' do let(:page_class) { Class.new(described_class) } - context 'when abstract class without validations' do - let!(:page_class) do - Howitzer::Web::PageValidator.instance_variable_set(:@pages, []) - Class.new(described_class) - end - it { expect(Howitzer::Web::PageValidator.pages).to eq([]) } - end - context 'when class has validations' do - let!(:page_class) do - allow(described_class).to receive(:validations) { { title: /some text/ } } - Howitzer::Web::PageValidator.instance_variable_set(:@pages, []) - Class.new(described_class) - end - it { expect(Howitzer::Web::PageValidator.pages).to eq([page_class]) } - end it 'can not be instantiated with new' do expect { page_class.new }.to raise_error(NoMethodError, "private method `new' called for #{page_class}") end end