Class: Mechanize::TestCase

Inherits:
Minitest::Test
  • Object
show all
Defined in:
lib/mechanize/test_case.rb

Overview

A generic test case for testing mechanize. Using a subclass of Mechanize::TestCase for your tests will create an isolated mechanize instance that won’t pollute your filesystem or other tests.

Once Mechanize::TestCase is loaded no HTTP requests will be made outside mechanize itself. All requests are handled via WEBrick servlets.

Mechanize uses WEBrick servlets to test some functionality. You can run other HTTP clients against the servlets using:

ruby -rmechanize/test_case/server -e0

Which will launch a test server at localhost:8000

Constant Summary collapse

TEST_DIR =
File.expand_path '../../../test', __FILE__
REQUESTS =
[]

Instance Method Summary collapse

Instance Method Details

Creates a Mechanize::CookieJar by parsing the given str



85
86
87
88
89
# File 'lib/mechanize/test_case.rb', line 85

def cookie_jar str, uri = URI('http://example')
  Mechanize::CookieJar.new.tap do |jar|
    jar.parse str, uri
  end
end

#fake_page(agent = @mech) ⇒ Object

Creates a fake page with URI fake.example and an empty, submittable form.



54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/mechanize/test_case.rb', line 54

def fake_page agent = @mech
  uri = URI 'http://fake.example/'
  html = String.new(<<~END)
    <html>
    <body>
    <form><input type="submit" value="submit" /></form>
    </body>
    </html>
  END

  Mechanize::Page.new uri, nil, html, 200, agent
end

#file_contents_without_cr(path) ⇒ Object

Return the contents of the file without Windows carriage returns



182
183
184
# File 'lib/mechanize/test_case.rb', line 182

def file_contents_without_cr(path)
  File.read(path).gsub(/\r\n/, "\n")
end

#have_encoding?Boolean

Is the Encoding constant defined?

Returns:

  • (Boolean)


70
71
72
# File 'lib/mechanize/test_case.rb', line 70

def have_encoding?
  Object.const_defined? :Encoding
end

#html_page(body) ⇒ Object

Creates a Mechanize::Page with the given body



77
78
79
80
# File 'lib/mechanize/test_case.rb', line 77

def html_page body
  uri = URI 'http://example/'
  Mechanize::Page.new uri, nil, body, 200, @mech
end

#in_tmpdirObject

Runs the block inside a temporary directory



94
95
96
97
98
99
100
# File 'lib/mechanize/test_case.rb', line 94

def in_tmpdir
  Dir.mktmpdir do |dir|
    Dir.chdir dir do
      yield
    end
  end
end

#node(element, attributes = {}) ⇒ Object

Creates a Nokogiri Node element with the given attributes



105
106
107
108
109
110
111
# File 'lib/mechanize/test_case.rb', line 105

def node element, attributes = {}
  Nokogiri::XML::Node.new(element, Nokogiri::HTML::Document.new).tap do |node|
    attributes.each do |name, value|
      node[name] = value
    end
  end
end

#page(uri, content_type = 'text/html', body = String.new, code = 200) ⇒ Object

Creates a Mechanize::Page for the given uri with the given content_type, response body and HTTP status code



117
118
119
120
121
122
# File 'lib/mechanize/test_case.rb', line 117

def page uri, content_type = 'text/html', body = String.new, code = 200
  uri = URI uri unless URI::Generic === uri

  Mechanize::Page.new(uri, { 'content-type' => content_type }, body, code,
                      @mech)
end

#requestsObject

Requests made during this tests



127
128
129
# File 'lib/mechanize/test_case.rb', line 127

def requests
  REQUESTS
end

#setupObject

Creates a clean mechanize instance @mech for use in tests.



41
42
43
44
45
46
47
48
# File 'lib/mechanize/test_case.rb', line 41

def setup
  super

  REQUESTS.clear
  @mech = Mechanize.new
  @ssl_private_key = nil
  @ssl_certificate = nil
end

#ssl_certificateObject

An X509 certificate. This certificate is the same across all test runs



148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/mechanize/test_case.rb', line 148

def ssl_certificate
  @ssl_certificate ||= OpenSSL::X509::Certificate.new <<-CERT
-----BEGIN CERTIFICATE-----
MIIBQjCB7aADAgECAgEAMA0GCSqGSIb3DQEBBQUAMCoxDzANBgNVBAMMBm5vYm9k
eTEXMBUGCgmSJomT8ixkARkWB2V4YW1wbGUwIBcNMTExMTAzMjEwODU5WhgPOTk5
OTEyMzExMjU5NTlaMCoxDzANBgNVBAMMBm5vYm9keTEXMBUGCgmSJomT8ixkARkW
B2V4YW1wbGUwWjANBgkqhkiG9w0BAQEFAANJADBGAkEA8pmEfmP0Ibir91x6pbts
4JmmsVZd3xvD5p347EFvBCbhBW1nv1GsbCBEFlSiT1q2qvxGb5IlbrfdhdgyqdTX
UQIBATANBgkqhkiG9w0BAQUFAANBAAAB////////////////////////////////
//8AMCEwCQYFKw4DAhoFAAQUePiv+QrJxyjtEJNnH5pB9OTWIqA=
-----END CERTIFICATE-----
  CERT
end

#ssl_private_keyObject

An SSL private key. This key is the same across all test runs



134
135
136
137
138
139
140
141
142
143
# File 'lib/mechanize/test_case.rb', line 134

def ssl_private_key
  @ssl_private_key ||= OpenSSL::PKey::RSA.new <<-KEY
-----BEGIN RSA PRIVATE KEY-----
MIG7AgEAAkEA8pmEfmP0Ibir91x6pbts4JmmsVZd3xvD5p347EFvBCbhBW1nv1Gs
bCBEFlSiT1q2qvxGb5IlbrfdhdgyqdTXUQIBAQIBAQIhAPumXslvf6YasXa1hni3
p80joKOug2UUgqOLD2GUSO//AiEA9ssY6AFxjHWuwo/+/rkLmkfO2s1Lz3OeUEWq
6DiHOK8CAQECAQECIQDt8bc4vS6wh9VXApNSKIpVygtxSFe/IwLeX26n77j6Qg==
-----END RSA PRIVATE KEY-----
  KEY
end

#tempfile(content) ⇒ Object

Creates a Tempfile with content that is immediately unlinked



165
166
167
168
169
170
171
172
# File 'lib/mechanize/test_case.rb', line 165

def tempfile content
  Tempfile.new(@NAME).tap do |body_io|
    body_io.unlink
    body_io.write content
    body_io.flush
    body_io.rewind
  end
end

#windows?Boolean

Returns true if the current platform is a Windows platform

Returns:

  • (Boolean)


176
177
178
# File 'lib/mechanize/test_case.rb', line 176

def windows?
  ::RUBY_PLATFORM =~ /mingw|mswin/
end