generic_test 0.1.8 → 0.1.13

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ed221c194f2b0ad95bd33839a69403f9fae9ef4f4ba4959c05d2d42e67860d90
4
- data.tar.gz: 4a43347e265705cf4e048867cd752473011830afd48851a3f8694f47f4000a3b
3
+ metadata.gz: b7fd4592cd7c34e39ae05d9db02ea20dd6ca739f368851db22dac04168504ec1
4
+ data.tar.gz: fb55093d314dfc89e13d0ec4342317106d6caef89dcd9e7341c42c79a59f464b
5
5
  SHA512:
6
- metadata.gz: 636ee1e1f48ef8729620121027fda4c84fc62c334332971b28730e01e97442a5661c0c7668cd06b6c94821a6b722e865b0143adfb7b51989c7c58e53d59c077c
7
- data.tar.gz: b58eb19575dab1a23e7567f7da6f79e9ef6937af97352de60668823f8a73228ef5c3bf11eceb81e069b4121c7c6a43e5943a3a6fb83f59cbe17151ec55b672f0
6
+ metadata.gz: f5ec80dd8977f15b6ffc3a66cec286a2183da371a10eb4d4428ff0f607d849e818bc303ffa96c3295e9ba787f7dcf092e95d64729318dcd357ee390937ec9680
7
+ data.tar.gz: 92d050bbbd02da8821ba2685cec5bcf86a1187a3f9a3ab82d4cc0ef44b0bc5d47644c520e81b5fd8859293021b840bb16571cf407f7fdc08924beaf67dbef97f
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ Gemfile.lock
15
15
 
16
16
  # rspec failure tracking
17
17
  .rspec_status
18
+ generic_test.page.yml
@@ -8,13 +8,13 @@ docker_build:
8
8
  # Use TLS https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled
9
9
  DOCKER_HOST: tcp://docker:2376
10
10
  DOCKER_TLS_CERTDIR: "/certs"
11
- stage: test
11
+ stage: deploy # Part of a later stage
12
12
  services:
13
13
  - docker:19.03.5-dind
14
14
  image: docker:19.03.5
15
15
  script:
16
16
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
17
- - docker pull $CI_REGISTRY_IMAGE:latest || true
17
+ - docker pull --quiet $CI_REGISTRY_IMAGE:latest || true
18
18
  - docker build -t $CI_REGISTRY_IMAGE:latest .
19
19
  - docker run -t $CI_REGISTRY_IMAGE:latest generic_test page samuel-garratt.gitlab.io/generic_test/about.html
20
20
  - docker push $CI_REGISTRY_IMAGE:latest
data/ChangeLog CHANGED
@@ -1,3 +1,27 @@
1
+ Version 0.1.13
2
+ * Enhancement
3
+ * Fail if cannot find url of page provided
4
+ * Ignore checking duplicate links
5
+
6
+ Version 0.1.12
7
+ * Enhancement
8
+ * More generic matching of username labels allowing any case to be used
9
+
10
+ Version 0.1.11
11
+ * Enhancement
12
+ * Spell check based on text of page, not HTML.
13
+ * Reject links that start with 'javascript:'
14
+ * Initial handling of logging into Login page with generic identifiers
15
+
16
+ Version 0.1.10
17
+ * Bug fix
18
+ * Add custom file implementing mock of what's needed for RSpecHtmlReporter
19
+ * Split email addresses into separate list and add validation for them using 'email_address' gem
20
+
21
+ Version 0.1.9
22
+ * Bug fix
23
+ * rspec-legacy_formatters will be needed for RSpecHtmlFormatter
24
+
1
25
  Version 0.1.8
2
26
  * Bug fix
3
27
  * Add rspec_html_reporter as required in rspec command
data/Dockerfile CHANGED
@@ -4,7 +4,7 @@ MAINTAINER Samuel Garratt
4
4
  # Required ruby gems
5
5
  RUN mkdir /test
6
6
  WORKDIR /test
7
- RUN gem install generic_test
7
+ RUN gem install bundler generic_test
8
8
 
9
9
  # Google chrome
10
10
  ARG CHROME_VERSION="google-chrome-stable"
data/README.md CHANGED
@@ -4,14 +4,16 @@ This gem provides an easy way to run generic tests for a website/api
4
4
 
5
5
  Test site is at https://samuel-garratt.gitlab.io/generic_test
6
6
 
7
- Run test gem through docker against this with
7
+ Run test gem through docker against this website with (Note it is an example that has some failures)
8
8
 
9
9
  `docker run -t registry.gitlab.com/samuel-garratt/generic_test generic_test page samuel-garratt.gitlab.io/generic_test`
10
10
 
11
- To get a log of your tests share a volume with the container
11
+ To get a log of your tests share a volume with the container.
12
12
 
13
13
  `docker run -v "$PWD":/test -t registry.gitlab.com/samuel-garratt/generic_test generic_test page samuel-garratt.gitlab.io/generic_test`
14
14
 
15
+ > Please share this volume from an empty folder. Running from within another gem might cause an issue
16
+
15
17
  ## Installation
16
18
 
17
19
  Add this line to your application's Gemfile:
@@ -33,14 +35,45 @@ Or install it yourself as:
33
35
  ### Running locally.
34
36
 
35
37
  Use the executable `generic_test`, add the page command and put a website to check:
38
+
39
+ `generic_test page URL_OF_WEBSITE`
40
+
41
+ E.g.,
42
+
36
43
  `generic_test page samuel-garratt.gitlab.io/generic_test`
37
44
 
38
45
  ### Run with docker
39
46
 
40
- docker run -t registry.gitlab.com/samuel-garratt/generic_test generic_test page URL
47
+ `docker run -t registry.gitlab.com/samuel-garratt/generic_test generic_test page URL_OF_WEBSITE`
41
48
 
42
49
  `docker run -t registry.gitlab.com/samuel-garratt/generic_test generic_test page samuel-garratt.gitlab.io/generic_test`
43
50
 
51
+ ### Through login page
52
+
53
+ Environment variables store Login URL, username and password
54
+ * GT_LOGIN_URL: Url to login at
55
+ * GT_USERNAME: Username to use
56
+ * GT_PASSWORD: Password to use
57
+
58
+ At the moment Generic test tries to be smart to identify the username, password and submit elements. In
59
+ the future, option will be given to provide your own identifiers if this does not work.
60
+
61
+ These variables can be set in `docker run`
62
+
63
+ `docker run -e "GT_LOGIN_URL=samuel-garratt.gitlab.io/generic_test/login_page" -e "GT_USERNAME=Tester" -e "GT_PASSWORD=Pass" -v "$PWD":/test -t registry.gitlab.com/samuel-garratt/generic_test generic_test page samuel-garratt.gitlab.io/generic_test`
64
+
65
+ These variables can also be set in a `.generic_test.page.yml` (you will need a volume to have this available to
66
+ docker container)
67
+
68
+ E.g., file to login as above:
69
+
70
+ ```yaml
71
+ login:
72
+ url: 'samuel-garratt.gitlab.io/generic_test/login_page'
73
+ username: 'Tester'
74
+ password: 'Pass'
75
+ ```
76
+
44
77
  ## Development
45
78
 
46
79
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/Rakefile CHANGED
@@ -4,20 +4,23 @@ require 'bundler/gem_tasks'
4
4
  require 'rspec/core/rake_task'
5
5
 
6
6
  RSpec::Core::RakeTask.new(spec: :start_website) do |task|
7
- task.pattern = 'spec/test_gem_spec.rb'
7
+ task.pattern = 'spec/test_gem/*spec.rb'
8
8
  end
9
9
 
10
10
  directory 'logs'
11
11
 
12
12
  desc 'Start virtual web service'
13
13
  task start_website: :logs do
14
+ require 'generic_test'
14
15
  mkdir_p 'logs'
15
16
  ENV['test_site_pid'] = Process.spawn('jekyll', 'serve', '-s', 'test_site',
16
17
  err: %w[logs/test_site.log w]).to_s
17
18
  sleep 2 # Wait a little for virtual server to start up
18
19
  puts 'Running test site on pid ' + ENV['test_site_pid']
19
20
  ENV['PAGE_URL'] = 'http://127.0.0.1:4000'
20
- ENV['PAGE_NUM'] = '1'
21
+ ENV[GT_USERNAME] = 'Test User'
22
+ ENV[GT_PASSWORD] = 'Test Password'
23
+ ENV[GT_LOGIN_URL] = 'http://127.0.0.1:4000/login_page.html'
21
24
  end
22
25
 
23
26
  task default: :spec
@@ -16,10 +16,16 @@ class Exe < Thor
16
16
  desc = ENV['PAGE_URL'].split('://').last.tr('/', '_')
17
17
  junit_format = "-f RspecJunitFormatter --out logs/page_#{desc}.xml"
18
18
  ENV['REPORT_PATH'] = "reports/#{desc}"
19
- html_format = '--require rspec_html_reporter -f RspecHtmlReporter'
19
+ html_format = '--require generic_test/html_reporter -f RspecHtmlReporter'
20
20
  command = "rspec #{test_file_path} --format documentation --color #{junit_format} #{html_format}"
21
21
  raise $CHILD_STATUS.to_s unless system command
22
22
  end
23
+
24
+ desc 'version', 'Version of generic_test'
25
+ def version
26
+ require 'generic_test'
27
+ puts "GenericTest version #{GenericTest::VERSION}"
28
+ end
23
29
  end
24
30
 
25
- Exe.start(ARGV)
31
+ Exe.start(ARGV)
@@ -15,7 +15,7 @@ Gem::Specification.new do |spec|
15
15
  spec.required_ruby_version = Gem::Requirement.new('>= 2.6.0')
16
16
  spec.metadata['homepage_uri'] = spec.homepage
17
17
  spec.metadata['source_code_uri'] = 'https://gitlab.com/samuel-garratt/generic_test'
18
- spec.metadata['changelog_uri'] = 'https://gitlab.com/samuel-garratt/soaspec/blob/master/ChangeLog'
18
+ spec.metadata['changelog_uri'] = 'https://gitlab.com/samuel-garratt/generic_test/blob/master/ChangeLog'
19
19
 
20
20
  # Specify which files should be added to the gem when it is released.
21
21
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -27,14 +27,18 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ['lib']
28
28
  # Development dependencies are installed too since running external tests within gem
29
29
  spec.add_development_dependency 'jekyll' # For hosting test website
30
- spec.add_dependency 'rake'
30
+ spec.add_development_dependency 'rake'
31
+ spec.add_dependency 'rspec-legacy_formatters' # Needed for rspec_html_reporter after RSpec 3
32
+ spec.add_dependency 'rspec_html_reporter' # Pretty HTML reports
33
+ spec.add_dependency 'rspec_junit_formatter' # Needed for nicer reporting of rspec for use in CI
34
+ spec.add_dependency 'simplecov' # Code coverage
31
35
 
32
- spec.add_dependency 'rest-client'
33
- spec.add_dependency 'rspec'
34
- spec.add_dependency 'rspec_html_reporter' # Pretty HTML reports
35
- spec.add_dependency 'rspec_junit_formatter' # Needed for nicer reporting of rspec for use in Gitlab
36
- spec.add_dependency 'spellcheck'
37
- spec.add_dependency 'thor' # Command line utility
38
- spec.add_dependency 'watir' # UI interaction
39
- spec.add_dependency 'webdrivers' # Download chromedriver
36
+ spec.add_dependency 'email_address' # Verify email address
37
+ spec.add_dependency 'rest-client' # Verify links
38
+ spec.add_dependency 'rspec' # Test framework
39
+ spec.add_dependency 'spellcheck' # Check for common spelling errors
40
+ spec.add_dependency 'thor' # Command line utility
41
+ spec.add_dependency 'watir' # UI interaction
42
+ spec.add_dependency 'webdrivers' # Download chromedriver automatically
43
+ spec.add_dependency 'yamler'
40
44
  end
@@ -7,6 +7,7 @@ require 'spellcheck'
7
7
  require 'watir'
8
8
  require 'webdrivers'
9
9
 
10
+ # Handles testing of sites generically for common issues
10
11
  module GenericTest
11
12
  class Error < StandardError; end
12
13
  @pages = []
@@ -14,24 +15,18 @@ module GenericTest
14
15
  # browser so less likely to be accurate for logged in pages
15
16
  @only_javascript = false
16
17
 
18
+ @tested_links = []
17
19
  class << self
18
20
  attr_accessor :browser
19
21
  attr_accessor :pages
22
+ attr_accessor :tested_links
20
23
  attr_accessor :only_javascript
21
-
22
- def setup
23
- ENV['HEADLESS'] ||= 'true'
24
- ENV['PAGE_NUM'] ||= '1'
25
- browser_args = %w[--disable-popup-blocking --no-sandbox --disable-dev-shm-usage]
26
- browser_args << '--headless' if ENV['HEADLESS'] == 'true'
27
-
28
- GenericTest.browser = Watir::Browser.new :chrome, args: browser_args
29
-
30
- raise 'PAGE_URL environment variable not set' unless ENV['PAGE_URL']
31
-
32
- browser = GenericTest.browser
33
- browser.goto ENV['PAGE_URL']
34
- GenericTest.pages << GenericTest::Page.new(browser)
35
- end
36
24
  end
37
25
  end
26
+
27
+ # @return [String] Generic Test URL to login before arriving at PAGE_URL to test.
28
+ # Needs GT_USERNAME and GT_PASSWORD to be used
29
+ GT_LOGIN_URL = 'GT_LOGIN_URL'
30
+ GT_USERNAME = 'GT_USERNAME'
31
+ GT_PASSWORD = 'GT_PASSWORD'
32
+ GT_PAGE_SETTING_FILE = 'generic_test.page.yml'
@@ -1,18 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rest-client'
4
+ require 'email_address'
4
5
 
5
6
  # Module for checking parts on a site
6
7
  module Checker
7
8
  class << self
8
- def valid_link?(href)
9
- !href.start_with?('mailto:')
10
- end
11
-
12
- # Usign Javascript fetch to retrieve URL. See https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch and
9
+ # Using Javascript fetch to retrieve URL. See https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch and
13
10
  # https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters for details
14
11
  # @return [Integer] Status code
15
12
  def link_status(href)
13
+ return unless href
14
+
16
15
  init_options = "const myInit = {
17
16
  method: 'GET',
18
17
  credentials: 'same-origin',
@@ -27,6 +26,11 @@ module Checker
27
26
  raise GenericTest::Error, "Failed to fetch url '#{href}'"
28
27
  end
29
28
 
29
+ # @return [Nil, String] Nil if valid, string if error
30
+ def valid_email?(email_address)
31
+ EmailAddress.error email_address
32
+ end
33
+
30
34
  # Use rest-client to try and get status of URL
31
35
  def call_via_rest_client(href)
32
36
  RestClient.get(href).code
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Mock implementation of Bundler for use by generic_test where Bundler.root is needed
4
+ module Bundler
5
+ class << self
6
+ # Used just so that RSpecHtmlReporter does not thrown an error
7
+ def root
8
+ ''
9
+ end
10
+ end
11
+ end
12
+
13
+ require 'rspec_html_reporter'
@@ -1,20 +1,30 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GenericTest
2
4
  # Represents a web page state at a particular point of time
3
5
  class Page
4
6
  # @return [Array] List of links
5
7
  attr_accessor :links
8
+ # @return [Array] List of emails
9
+ attr_accessor :emails
6
10
  attr_accessor :url
7
11
  attr_accessor :html
12
+ attr_accessor :text
8
13
  attr_accessor :title
9
14
 
10
15
  # Store state of page when it is loaded
11
16
  # @param [Watir::Browser] browser Watir browser
12
17
  def initialize(browser)
13
- self.links = browser.links
18
+ self.emails, self.links = browser.links.partition do |link|
19
+ link.href.start_with?('mailto:')
20
+ end
21
+ links.reject! { |link| link.href.empty? || link.href.start_with?('javascript:') }
22
+ emails.collect! { |link| link.href.split(':').last }
14
23
  self.url = browser.url
15
24
  self.html = browser.html
25
+ self.text = browser.text
16
26
  self.title = browser.title
17
- puts "Found #{links.count} links at #{url} (#{title})"
27
+ puts "Found #{links.count} links, #{emails.count} emails at #{url} (#{title})"
18
28
  end
19
29
  end
20
30
  end
@@ -1,4 +1,41 @@
1
- # One file to require gem and set things up
1
+ # frozen_string_literal: true
2
+
3
+ # One file to require gem and set things up, arriving at page to check
2
4
  require 'generic_test'
5
+ require_relative 'xpath'
6
+
7
+ ENV['HEADLESS'] ||= 'true'
8
+ ENV['PAGE_NUM'] ||= '1'
9
+ browser_args = %w[--disable-popup-blocking --no-sandbox --disable-dev-shm-usage]
10
+ browser_args << '--headless' if ENV['HEADLESS'] == 'true'
11
+
12
+ GenericTest.browser = Watir::Browser.new :chrome, args: browser_args
13
+
14
+ raise 'PAGE_URL environment variable not set' unless ENV['PAGE_URL']
15
+
16
+ require 'yamler'
17
+ if File.exist?(GT_PAGE_SETTING_FILE) && !File.read(GT_PAGE_SETTING_FILE).empty?
18
+ gt_page_settings = Yamler.load 'generic_test.page.yml'
19
+ if gt_page_settings['login']
20
+ ENV[GT_USERNAME] = gt_page_settings['login']['username']
21
+ ENV[GT_PASSWORD] = gt_page_settings['login']['password']
22
+ ENV[GT_LOGIN_URL] = gt_page_settings['login']['url']
23
+ end
24
+ end
25
+
26
+ browser = GenericTest.browser
27
+ if ENV[GT_LOGIN_URL] && ENV[GT_USERNAME] && ENV[GT_PASSWORD]
28
+ browser.goto ENV[GT_LOGIN_URL]
29
+ browser.text_field(xpath: Xpath.label_or_attribute('username')).set ENV[GT_USERNAME]
30
+ browser.text_field(xpath: Xpath.label_or_attribute('password')).set ENV[GT_PASSWORD]
31
+ login_button = browser.button(xpath: "//*[@type='submit']|//*[@*='Login']")
32
+ login_button.click
33
+ login_button.wait_while(&:present?)
34
+ puts "Login through #{ENV[GT_LOGIN_URL]} successful!"
35
+ end
3
36
 
4
- GenericTest.setup
37
+ ENV['PAGE_URL'] = RestClient.get(ENV['PAGE_URL']).request.url # Check page exists
38
+ puts "Checking #{ENV['PAGE_URL']}"
39
+ browser.goto ENV['PAGE_URL']
40
+ sleep 2.5 # Give a bit of time for page to load
41
+ GenericTest.pages << GenericTest::Page.new(browser)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GenericTest
4
- VERSION = '0.1.8'
4
+ VERSION = '0.1.13'
5
5
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Module to help form xpaths for generic identification
4
+ module Xpath
5
+ class << self
6
+ # @return [String] Translate string to uppercase letters
7
+ def upcase(xpath_method)
8
+ "translate(#{xpath_method},'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"
9
+ end
10
+
11
+ # @return [String] Xpath to retrieve input beside a label
12
+ def input_by_label(label)
13
+ upcase_text = upcase('text()')
14
+ "//input[@id=(//label[contains(#{upcase_text},'#{label.upcase}')]/@for)]"
15
+ end
16
+
17
+ # @return [String] Xpath to retrieve input either by a label or a attribute matching it
18
+ def label_or_attribute(field_name)
19
+ any_input_with_atr = "//input[@*='#{field_name}']"
20
+ input_with_text = "//input[text()='#{field_name}']"
21
+ [input_by_label(field_name), any_input_with_atr, input_with_text]
22
+ .join('|')
23
+ end
24
+ end
25
+ end
@@ -1,25 +1,36 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Used by executable to verify a particular web page
3
4
  require 'generic_test/setup'
4
5
  page = GenericTest.pages.first
5
6
  links = page.links
6
7
  RSpec.describe "#{page.title} Links respond" do
7
8
  links.each_with_index do |link, index|
8
- next unless link.href && !link.href.empty?
9
-
10
9
  link_text = link.text.to_s.empty? ? '' : " \"#{link.text}\""
10
+ next if GenericTest.tested_links.include? link.href
11
+
12
+ GenericTest.tested_links << link.href
11
13
  it "Link (#{index + 1})#{link_text} to '#{link.href}' succeeds" do
12
- if Checker.valid_link? link.href
13
- expect(Checker.link_status(link.href)).to be_between 200, 399
14
- end
14
+ expect(Checker.link_status(link.href)).to be_between 200, 399
15
+ end
16
+ end
17
+ puts "Checking #{GenericTest.tested_links.count} non duplicate links"
18
+ end
19
+
20
+ emails = page.emails
21
+ RSpec.describe "#{page.title} Emails are valid" do
22
+ emails.each do |email|
23
+ it "Email (#{email}) is valid" do
24
+ expect(Checker.valid_email?(email)).to be nil
15
25
  end
16
26
  end
17
27
  end
28
+
18
29
  RSpec.describe "#{page.title} Page content" do
19
- spellcheck_report = SpellCheck::ProofReader.check(page.html)
30
+ spellcheck_report = SpellCheck::ProofReader.check(page.text)
20
31
  context 'does not have common spelling mistakes' do
21
32
  it 'has no mistakes' do
22
- expect(spellcheck_report.status).to eq 'Accept'
33
+ expect(spellcheck_report.errata.size).to eq 0
23
34
  end
24
35
  spellcheck_report.errata.group_by(&:line_number).each do |line_number, mistakes|
25
36
  context "Line #{line_number}" do
@@ -1,15 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'bundler/setup'
4
+ require 'simplecov'
5
+ SimpleCov.start do
6
+ add_filter 'spec'
7
+ end
8
+
9
+ SimpleCov.at_exit do
10
+ SimpleCov.result.format!
11
+ SimpleCov.minimum_coverage 85
12
+ end
13
+
4
14
  require 'generic_test/setup'
5
15
 
6
16
  RSpec.configure do |config|
7
17
  # Close test server after all RSpec tests have run
8
18
  config.after(:suite) do
9
- GenericTest.browser&.close
10
19
  if ENV['test_site_pid']
11
20
  puts "Closing test site at #{ENV['test_site_pid']}"
12
21
  Process.kill(:QUIT, ENV['test_site_pid'].to_i)
13
22
  end
23
+ GenericTest.browser&.close
14
24
  end
15
25
  end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Test gem works
4
+
5
+ page = GenericTest.pages.first
6
+ links = page.links
7
+
8
+ RSpec.describe 'Links' do
9
+ it 'counts correctly (not include invalid)' do
10
+ expect(links.size).to eq 3
11
+ end
12
+ context 'successful' do
13
+ it 'external page' do
14
+ expect(Checker.link_status(links[0].href)).to be_between 200, 399
15
+ end
16
+ it 'internal link' do
17
+ expect(Checker.link_status(links[2].href)).to be_between 200, 399
18
+ end
19
+ end
20
+ it 'broken causes failure' do
21
+ puts page.links[1].text
22
+ puts page.links[1].href
23
+ expect(Checker.link_status(links[1].href)).to eq 404
24
+ end
25
+ end
26
+
27
+ RSpec.describe 'Emails' do
28
+ it 'counts correctly' do
29
+ expect(page.emails.size).to eq 2
30
+ end
31
+ context 'validate' do
32
+ it 'accepts valid email' do
33
+ expect(Checker.valid_email?(page.emails[0])).to be nil
34
+ end
35
+ it 'returns invalid email error' do
36
+ expect(Checker.valid_email?(page.emails[1])).to eq 'Domain name not registered'
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'generic_test/xpath'
4
+
5
+ describe Xpath do
6
+ context '.upcase' do
7
+ it 'return xpath upcase function' do
8
+ expect(Xpath.upcase('text()')).to include 'translate(text()'
9
+ end
10
+ end
11
+ end
@@ -11,5 +11,6 @@
11
11
  All tests in this page work
12
12
  </p>
13
13
  <a href="index.html">Index page</a>
14
+ <a href="mailto:samuel.garratt@integrationqa.com">Email me</a>
14
15
  </body>
15
16
  </html>
@@ -12,6 +12,12 @@
12
12
  <p id="broken_link">
13
13
  <a href="broken_link.html">Broken link</a>
14
14
  </p>
15
+ <h2><a id="special_links"></a> Special links</h2>
16
+ <p>
17
+ <a href="mailto:samuel.garratt@integrationqa.com">Email me</a>
18
+ <a href="#special_links">Link to heading</a>
19
+ <a href="mailto:invalid.person@bad-d0main.com">Don't try to email this</a>
20
+ </p>
15
21
  <p>hello world.
16
22
 
17
23
  I create aplication now.
@@ -0,0 +1,23 @@
1
+ <html>
2
+ <head>
3
+ <title>Login Page</title>
4
+ </head>
5
+ <body>
6
+ <header>
7
+ <h1>Mock Login Page for testing login inputs can be entered</h1>
8
+ </header>
9
+ <p>
10
+ A login page like this can be entered before generic test done
11
+ </p>
12
+ <p>
13
+ <form action="about.html">
14
+ <label for="jdlksjdlsa">User-name</label>
15
+ <input id="jdlksjdlsa" value="username" />
16
+ <label for="231321321">Password</label>
17
+ <input id="231321321" />
18
+ <button type="submit">Submit</button>
19
+ </form>
20
+ </p>
21
+ <a href="index.html">Index page</a>
22
+ </body>
23
+ </html>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: generic_test
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Garratt
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-17 00:00:00.000000000 Z
11
+ date: 2020-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -26,6 +26,20 @@ dependencies:
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-legacy_formatters
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - ">="
@@ -39,7 +53,7 @@ dependencies:
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
- name: rest-client
56
+ name: rspec_html_reporter
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - ">="
@@ -53,7 +67,7 @@ dependencies:
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
- name: rspec
70
+ name: rspec_junit_formatter
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - ">="
@@ -67,7 +81,7 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: rspec_html_reporter
84
+ name: simplecov
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - ">="
@@ -81,7 +95,35 @@ dependencies:
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
- name: rspec_junit_formatter
98
+ name: email_address
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rest-client
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
85
127
  requirement: !ruby/object:Gem::Requirement
86
128
  requirements:
87
129
  - - ">="
@@ -150,6 +192,20 @@ dependencies:
150
192
  - - ">="
151
193
  - !ruby/object:Gem::Version
152
194
  version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: yamler
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
153
209
  description: Easy way to run generic tests for a website/api.
154
210
  email:
155
211
  - samuel.garratt@integrationqa.com
@@ -175,21 +231,25 @@ files:
175
231
  - generic_test.gemspec
176
232
  - lib/generic_test.rb
177
233
  - lib/generic_test/checker.rb
234
+ - lib/generic_test/html_reporter.rb
178
235
  - lib/generic_test/page.rb
179
236
  - lib/generic_test/setup.rb
180
237
  - lib/generic_test/version.rb
238
+ - lib/generic_test/xpath.rb
181
239
  - spec/generic_test_spec.rb
182
240
  - spec/spec_helper.rb
183
- - spec/test_gem_spec.rb
241
+ - spec/test_gem/page_spec.rb
242
+ - spec/test_gem/xpath_spec.rb
184
243
  - test_site/about.html
185
244
  - test_site/index.html
245
+ - test_site/login_page.html
186
246
  homepage: https://gitlab.com/samuel-garratt/generic_test
187
247
  licenses:
188
248
  - MIT
189
249
  metadata:
190
250
  homepage_uri: https://gitlab.com/samuel-garratt/generic_test
191
251
  source_code_uri: https://gitlab.com/samuel-garratt/generic_test
192
- changelog_uri: https://gitlab.com/samuel-garratt/soaspec/blob/master/ChangeLog
252
+ changelog_uri: https://gitlab.com/samuel-garratt/generic_test/blob/master/ChangeLog
193
253
  post_install_message:
194
254
  rdoc_options: []
195
255
  require_paths:
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Test gem works internally
4
-
5
- page = GenericTest.pages.first
6
- links = page.links
7
- puts links.collect(&:text)
8
- RSpec.describe 'Links respond' do
9
- it 'successful link passes' do
10
- expect(Checker.link_status(links[0].href)).to be_between 200, 399
11
- end
12
- it 'broken link causes failure' do
13
- expect(Checker.link_status(links[1].href)).to eq 404
14
- end
15
- end