Commit 2659252f authored by Kyle Fuller's avatar Kyle Fuller

[linter] Refactor URL validation tests

parent dfbacc75
require File.expand_path('../../spec_helper', __FILE__)
require 'webmock'
module Bacon
class Context
......@@ -86,8 +87,7 @@ module Pod
file = write_podspec(stub_podspec)
validator = Validator.new(file)
validator.quick = true
validator.stubs(:validate_homepage)
validator.stubs(:validate_screenshots)
validator.stubs(:validate_url)
validator.validate
validator.validation_dir.should.be == Pathname.new("/private/tmp/CocoaPods/Lint")
end
......@@ -97,9 +97,7 @@ module Pod
describe "Extensive analysis" do
describe "Homepage validation" do
require 'webmock'
describe "URL validation" do
before do
@sut = Validator.new(podspec_path)
@sut.stubs(:install_pod)
......@@ -108,101 +106,95 @@ module Pod
@sut.stubs(:tear_down_validation_environment)
end
it "checks if the homepage is valid" do
WebMock::API.stub_request(:head, /not-found/).to_return(:status => 404)
WebMock::API.stub_request(:get, /not-found/).to_return(:status => 404)
Specification.any_instance.stubs(:homepage).returns('http://banana-corp.local/not-found/')
@sut.validate
@sut.results.map(&:to_s).first.should.match /The URL (.*) is not reachable/
end
it "indicates if it was not able to validate the homepage" do
WebMock::API.stub_request(:head, 'banana-corp.local').to_raise(SocketError)
Specification.any_instance.stubs(:homepage).returns('http://banana-corp.local/')
@sut.validate
@sut.results.map(&:to_s).first.should.match /There was a problem validating the URL/
end
it "does not fail if the homepage redirects" do
WebMock::API.stub_request(:head, /redirect/).to_return(
:status => 301, :headers => { 'Location' => 'http://banana-corp.local/found/' } )
WebMock::API.stub_request(:head, /found/).to_return( :status => 200 )
Specification.any_instance.stubs(:homepage).returns('http://banana-corp.local/redirect/')
@sut.validate
@sut.results.length.should.equal 0
end
it "does not fail if the homepage does not support HEAD" do
WebMock::API.stub_request(:head, /page/).to_return( :status => 405 )
WebMock::API.stub_request(:get, /page/).to_return( :status => 200 )
Specification.any_instance.stubs(:homepage).returns('http://banana-corp.local/page/')
@sut.validate
@sut.results.length.should.equal 0
end
it "does not fail if the homepage errors on HEAD" do
WebMock::API.stub_request(:head, /page/).to_return( :status => 500 )
WebMock::API.stub_request(:get, /page/).to_return( :status => 200 )
Specification.any_instance.stubs(:homepage).returns('http://banana-corp.local/page/')
@sut.validate
@sut.results.length.should.equal 0
end
it "does not follow redirects infinitely" do
WebMock::API.stub_request(:head, /redirect/).to_return(
:status => 301,
:headers => { 'Location' => 'http://banana-corp.local/redirect/' } )
Specification.any_instance.stubs(:homepage).returns(
'http://banana-corp.local/redirect/')
@sut.validate
@sut.results.map(&:to_s).first.should.match /The URL \(.*\) is not reachable/
end
it "supports relative redirects" do
WebMock::API.stub_request(:head, /redirect/).to_return(
:status => 302,
:headers => { 'Location' => '/foo' })
WebMock::API.stub_request(:head, /foo/).to_return(
describe "Homepage validation" do
it "checks if the homepage is valid" do
WebMock::API.stub_request(:head, /not-found/).to_return(:status => 404)
WebMock::API.stub_request(:get, /not-found/).to_return(:status => 404)
Specification.any_instance.stubs(:homepage).returns('http://banana-corp.local/not-found/')
@sut.validate
@sut.results.map(&:to_s).first.should.match /The URL (.*) is not reachable/
end
it "indicates if it was not able to validate the homepage" do
WebMock::API.stub_request(:head, 'banana-corp.local').to_raise(SocketError)
Specification.any_instance.stubs(:homepage).returns('http://banana-corp.local/')
@sut.validate
@sut.results.map(&:to_s).first.should.match /There was a problem validating the URL/
end
it "does not fail if the homepage redirects" do
WebMock::API.stub_request(:head, /redirect/).to_return(
:status => 301, :headers => { 'Location' => 'http://banana-corp.local/found/' } )
WebMock::API.stub_request(:head, /found/).to_return( :status => 200 )
Specification.any_instance.stubs(:homepage).returns('http://banana-corp.local/redirect/')
@sut.validate
@sut.results.length.should.equal 0
end
it "does not fail if the homepage does not support HEAD" do
WebMock::API.stub_request(:head, /page/).to_return( :status => 405 )
WebMock::API.stub_request(:get, /page/).to_return( :status => 200 )
Specification.any_instance.stubs(:homepage).returns('http://banana-corp.local/page/')
@sut.validate
@sut.results.length.should.equal 0
end
it "does not fail if the homepage errors on HEAD" do
WebMock::API.stub_request(:head, /page/).to_return( :status => 500 )
WebMock::API.stub_request(:get, /page/).to_return( :status => 200 )
Specification.any_instance.stubs(:homepage).returns('http://banana-corp.local/page/')
@sut.validate
@sut.results.length.should.equal 0
end
it "does not follow redirects infinitely" do
WebMock::API.stub_request(:head, /redirect/).to_return(
:status => 301,
:headers => { 'Location' => 'http://banana-corp.local/redirect/' } )
Specification.any_instance.stubs(:homepage).returns(
'http://banana-corp.local/redirect/')
@sut.validate
@sut.results.map(&:to_s).first.should.match /The URL \(.*\) is not reachable/
end
it "supports relative redirects" do
WebMock::API.stub_request(:head, /redirect/).to_return(
:status => 302,
:headers => { 'Location' => '/foo' })
WebMock::API.stub_request(:head, /foo/).to_return(
:status => 200 )
Specification.any_instance.stubs(:homepage).returns(
'http://banana-corp.local/redirect')
@sut.validate
@sut.results.length.should.equal 0
Specification.any_instance.stubs(:homepage).returns(
'http://banana-corp.local/redirect')
@sut.validate
@sut.results.length.should.equal 0
end
end
end
describe "Screenshot validation" do
require 'webmock'
before do
@sut = Validator.new(podspec_path)
@sut.stubs(:install_pod)
@sut.stubs(:build_pod)
@sut.stubs(:check_file_patterns)
@sut.stubs(:tear_down_validation_environment)
@sut.stubs(:validate_homepage)
WebMock::API.stub_request(:head, 'banana-corp.local/valid-image.png').to_return(:status => 200, :headers => { 'Content-Type' => 'image/png' })
end
it "checks if the screenshots are valid" do
Specification.any_instance.stubs(:screenshots).returns(['http://banana-corp.local/valid-image.png'])
@sut.validate
@sut.results.should.be.empty?
end
it "should fail if any of the screenshots URLS do not return an image" do
WebMock::API.stub_request(:head, 'banana-corp.local/').to_return(:status => 200)
Specification.any_instance.stubs(:screenshots).returns(['http://banana-corp.local/valid-image.png', 'http://banana-corp.local/'])
@sut.validate
@sut.results.map(&:to_s).first.should.match /The screenshot .* is not a valid image/
describe "Screenshot validation" do
before do
@sut.stubs(:validate_homepage)
WebMock::API.stub_request(:head, 'banana-corp.local/valid-image.png').to_return(:status => 200, :headers => { 'Content-Type' => 'image/png' })
end
it "checks if the screenshots are valid" do
Specification.any_instance.stubs(:screenshots).returns(['http://banana-corp.local/valid-image.png'])
@sut.validate
@sut.results.should.be.empty?
end
it "should fail if any of the screenshots URLS do not return an image" do
WebMock::API.stub_request(:head, 'banana-corp.local/').to_return(:status => 200)
Specification.any_instance.stubs(:screenshots).returns(['http://banana-corp.local/valid-image.png', 'http://banana-corp.local/'])
@sut.validate
@sut.results.map(&:to_s).first.should.match /The screenshot .* is not a valid image/
end
end
end
it "respects the no clean option" do
file = write_podspec(stub_podspec)
sut = Validator.new(file)
sut.stubs(:validate_homepage)
sut.stubs(:validate_screenshots)
sut.stubs(:validate_url)
sut.no_clean = true
sut.validate
sut.validation_dir.should.exist
......@@ -211,8 +203,7 @@ module Pod
it "builds the pod per platform" do
file = write_podspec(stub_podspec)
sut = Validator.new(file)
sut.stubs(:validate_homepage)
sut.stubs(:validate_screenshots)
sut.stubs(:validate_url)
sut.expects(:install_pod).twice
sut.expects(:build_pod).twice
sut.expects(:check_file_patterns).twice
......@@ -221,7 +212,7 @@ module Pod
it "uses the deployment target of the specification" do
sut = Validator.new(podspec_path)
sut.stubs(:validate_homepage)
sut.stubs(:validate_url)
sut.stubs(:validate_screenshots)
podfile = sut.send(:podfile_from_spec, :ios, '5.0')
dependency = podfile.target_definitions['Pods'].dependencies.first
......@@ -230,8 +221,7 @@ module Pod
it "respects the local option" do
sut = Validator.new(podspec_path)
sut.stubs(:validate_homepage)
sut.stubs(:validate_screenshots)
sut.stubs(:validate_url)
podfile = sut.send(:podfile_from_spec, :ios, '5.0')
deployment_target = podfile.target_definitions['Pods'].platform.deployment_target
deployment_target.to_s.should == "5.0"
......@@ -241,8 +231,7 @@ module Pod
sut = Validator.new(podspec_path)
sut.stubs(:check_file_patterns)
sut.stubs(:xcodebuild).returns("file.m:1:1: warning: direct access to objective-c's isa is deprecated")
sut.stubs(:validate_homepage)
sut.stubs(:validate_screenshots)
sut.stubs(:validate_url)
sut.validate
first = sut.results.map(&:to_s).first
first.should.include "[xcodebuild]"
......@@ -253,8 +242,7 @@ module Pod
file = write_podspec(stub_podspec(/s\.source_files = 'JSONKit\.\*'/, "s.source_files = 'wrong_paht.*'"))
sut = Validator.new(file)
sut.stubs(:build_pod)
sut.stubs(:validate_homepage)
sut.stubs(:validate_screenshots)
sut.stubs(:validate_url)
sut.validate
sut.results.map(&:to_s).first.should.match /source_files.*did not match/
sut.result_type.should == :error
......@@ -268,8 +256,7 @@ module Pod
spec = Specification.from_file(file)
sut = Validator.new(spec)
sut.stubs(:validate_homepage)
sut.stubs(:validate_screenshots)
sut.stubs(:validate_url)
sut.stubs(:build_pod)
sut.validate
sut.validated?.should.be.true
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment