Minitest::HaveTag

Ruby - Gem Version - Minitest Style Guide

Adds methods to Minitest to test for existence of HTML tags, including contents, within a provided string.

Added methods:

Minitest::Assertions

  • :assert_have_tag(actual, expected, contents = nil, msg = nil)

  • :refute_have_tag(actual, expected, contents = nil, msg = nil)

Minitest::Expectations

  • _(actual).must_have_tag(expected, contents = nil, msg = nil)

  • _(actual).wont_have_tag(expected, contents = nil, msg = nil)


Installation

Add this gem to your application Gemfile:

gem 'minitest-have_tag'

or for the cutting edge:

gem 'minitest-have_tag',
    git: 'https://github.com/kematzy/minitest-have_tag',
    branch: 'master'

To install the gems, run:

bundle install

Usage

Load the gem in your spec/spec_helper.rb file as follows:

# <snip...>

require 'minitest/autorun'
# load assert_have_tag() support
require 'minitest/have_tag'

# <snip...>

Adding the above to your spec/spec_helper.rb file automatically adds the key helper methods to the Minitest::Assertions to test for existence of HTML tag, including contents, within the provided String.


assert_have_tag()

assert_have_tag('<br>', 'br')

# check for CSS :class attribute
assert_have_tag('<hr class="divider">', 'hr.divider')
assert_have_tag('<hr class="divider">', 'hr[@class=divider]')

# check for CSS :id attribute
assert_have_tag('<hr id="divider">', 'hr#divider')
assert_have_tag('<hr id="divider">', 'hr[@id=divider]')

# check for contents within a <div...>
assert_have_tag('<div class="row">contents</div>', 'hr.row', 'contents')

html = <<~HTML
  <div id="intro" class="row">
    <div class="col-md-12">
      <h1>Header</h1>
    </div>
  </div>
HTML

#
assert_have_tag(html, 'div#intro.row > .col-md-12 > h1', 'Header')

Produces an extensive error message when something is wrong

assert_have_tag('<br>', 'brr')
   #=> 'Expected "<br>" to have tag ["brr"], but no such tag was found'

:refute_have_tag()

Method to test for non-existence of the expected HTML tag, including contents, within the provided string.

refute_have_tag('<abbr>', 'br')

# check for CSS :class attribute
refute_have_tag('<hr class="divider">', 'hr.space')
refute_have_tag('<hr class="divider">', 'hr[@class=space]')

# check for CSS :id attribute
refute_have_tag('<hr id="divider">', 'hr#space')
refute_have_tag('<hr id="divider">', 'hr[@id=space]')

# check for contents within a <div...>
refute_have_tag('<div class="row">contents</div>', 'hr.row', '<h1>Header</h1>')

html = <<~HTML
  <div id="intro" class="row">
    <div class="col-md-12">
      <h1>Header</h1>
    </div>
  </div>
HTML

#
refute_have_tag(html, 'div#intro.row > .col-md-12 > h1', 'Header')

Produces an extensive error message when something is wrong:

 refute_have_tag('<br>', 'br')
   #=> 'Expected "<br>" to NOT have tag ["br"], but such a tag was found'

Dependencies

This Gem depends upon the following:

Runtime

  • minitest
  • nokogiri

Development & Tests

  • guard
  • guard-minitest
  • minitest
  • minitest-assert_errors
  • minitest-hooks
  • minitest-rg
  • rack-test (~> 2.1)
  • rake (~> 13.0)
  • rubocop (~> 1.31)
  • rubocop-minitest
  • rubocop-performance
  • rubocop-rake
  • simplecov

Development

Get started with these commands:

# clone the repository
git clone https://github.com/kematzy/minitest-have_tag.git

# change into repository directory
cd minitest-have_tag/

# install dependencies
bundle install

# run the default tests with coverage & rubocop checking
bundle exec rake

# enable automatic reloading of tests during development
bundle exec guard

To install this gem onto your local machine, run bundle exec rake install.

To release a new version:

  • ensure bundle exec rake passes.
  • update the version number in version.rb.
  • run bundle exec rake release to:
    • create a Git tag for the version;
    • pushes Git commits and tags to GitHub;
    • pushes the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub.

This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.


Note on Patches/Pull Requests

  • Fork the project.
  • Make your feature addition or bug fix in a separate branch.
  • Add spec tests for it. This is important so I don't break it in a future version unintentionally.
  • Commit, do not mess with Rakefile, version, or history.
    • (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.

Copyright (c) 2015 - 2024 Kematzy

Released under the MIT License. See LICENSE for further details.