diff --git a/README.md b/README.md index 5a09c63..c7f0487 100644 --- a/README.md +++ b/README.md @@ -312,11 +312,85 @@ You can also remember JSON inline: Then the JSON response at "0/first_name" should be %{FIRST_NAME} ``` +MiniTest +-------- + +json_spec matchers can be used in MiniTest tests. To use json_spec in your tests +you must use the minitest-matchers gem. In your `test_helper.rb` you must: + +```ruby +require "minitest/autorun" +require "minitest/matchers" +require "json_spec" +``` + +The matchers are now available in MiniTest's spec DSL as follows: + +```ruby +describe User, :to_json do + let(:user) { User.create! first_name: "Steve", last_name: "Richert" } + let(:names) { %({"first_name":"Steve","last_name":"Richert"}) } + + it "includes names" do + user.to_json.must be_json_eql(names).excluding("friends") + end + + it "includes the ID" do + user.to_json.must have_json_path("id") + user.to_json.must have_json_type(Integer).at_path("id") + end + + it "includes friends" do + user.to_json.must have_json_size(0).at_path("friends") + + friend = User.create! first_name: "Catie", last_name: "Richert" + user.friends << friend + + user.to_json.must have_json_size(1).at_path("friends") + user.to_json.must include_json(friend.to_json).at_path("friends") + end +end +``` + +The matchers are also available through MiniTest's classic assertions as follows: + +```ruby +class UserToJsonTest < MiniTest::Test + def setup + @user = User.create! first_name: "Steve", last_name: "Richert" + @names = %({"first_name":"Steve","last_name":"Richert"}) + end + + def test_includes_names + assert_must be_json_eql(@names).excluding("friends"), @user.to_json + end + + def test_includes_id + assert_have_json_path @user.to_json, "id" + assert_must have_json_path("id"), @user.to_json + + assert_must have_json_type(Integer).at_path("id"), @user.to_json + end + + def test_includes_friends + assert_must have_json_size(0).at_path("friends"), @user.to_json + + friend = User.create! first_name: "Catie", last_name: "Richert" + @user.friends << friend + + assert_must have_json_size(1).at_path("friends"), @user.to_json + assert_must include_json(friend.to_json).at_path("friends"), @user.to_json + end +end +``` + ### More -Check out the [specs](https://github.com/collectiveidea/json_spec/blob/master/spec) -and [features](https://github.com/collectiveidea/json_spec/blob/master/features) to see all the -various ways you can use json_spec. +Check out the different test suites to see all the various ways you can use json_spec: + +* [RSpec specs](https://github.com/collectiveidea/json_spec/blob/master/spec) +* [MiniTest tests](https://github.com/collectiveidea/json_spec/blob/master/test) +* [Cucumber features](https://github.com/collectiveidea/json_spec/blob/master/features) ## Contributing diff --git a/Rakefile b/Rakefile index e684b19..c89fca7 100644 --- a/Rakefile +++ b/Rakefile @@ -1,6 +1,7 @@ require "bundler/gem_tasks" require "rspec/core/rake_task" require "cucumber/rake/task" +require "rake/testtask" RSpec::Core::RakeTask.new(:spec) @@ -12,5 +13,11 @@ Cucumber::Rake::Task.new(:negative_cucumber) do |task| task.cucumber_opts = "--tags @fail --wip" end -task test: [:spec, :cucumber, :negative_cucumber] -task default: :test +Rake::TestTask.new do |t| + t.libs << "test" << "lib" + t.test_files = FileList['test/**/*_test.rb'] + t.verbose = true +end + +task :all => [:spec, :cucumber, :test] +task :default => :all diff --git a/features/support/env.rb b/features/support/env.rb index 5a497c1..34f3c82 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -1,4 +1,4 @@ -$: << File.expand_path("../../../lib", __FILE__) +$LOAD_PATH << ::File.expand_path('../../../lib', __FILE__) require "json_spec/cucumber" diff --git a/json_spec.gemspec b/json_spec.gemspec index 3c2626f..34ec6a5 100644 --- a/json_spec.gemspec +++ b/json_spec.gemspec @@ -6,14 +6,17 @@ Gem::Specification.new do |gem| gem.authors = ["Steve Richert"] gem.email = ["steve.richert@gmail.com"] - gem.summary = "Easily handle JSON in RSpec and Cucumber" - gem.description = "RSpec matchers and Cucumber steps for testing JSON content" + gem.summary = "Easily handle JSON in RSpec, MiniTest and Cucumber" + gem.description = "RSpec/MiniTest matchers and Cucumber steps for testing JSON content" gem.homepage = "https://github.com/collectiveidea/json_spec" gem.license = "MIT" gem.add_dependency "multi_json", "~> 1.0" - gem.add_dependency "rspec", ">= 2.0", "< 4.0" + gem.add_development_dependency "rspec", ">= 2.0", "< 4.0" + gem.add_development_dependency "cucumber" + gem.add_development_dependency "minitest", "~> 5.0" + gem.add_development_dependency "minitest-matchers", "~> 1.4" gem.add_development_dependency "bundler", "~> 1.0" gem.add_development_dependency "rake", "~> 10.0" diff --git a/lib/json_spec.rb b/lib/json_spec.rb index 8044741..decf0a1 100644 --- a/lib/json_spec.rb +++ b/lib/json_spec.rb @@ -1,5 +1,4 @@ require "json" -require "rspec" require "json_spec/errors" require "json_spec/configuration" require "json_spec/exclusion" diff --git a/lib/json_spec/matchers.rb b/lib/json_spec/matchers.rb index cf58e89..2e6b7f1 100644 --- a/lib/json_spec/matchers.rb +++ b/lib/json_spec/matchers.rb @@ -25,9 +25,25 @@ def have_json_type(type) def have_json_size(size) JsonSpec::Matchers::HaveJsonSize.new(size) end + + def self.included(base) + if base.respond_to?(:register_matcher) + instance_methods.each do |name| + base.register_matcher name, name + end + end + end + end +end + +if defined?(RSpec) + RSpec.configure do |config| + config.include JsonSpec::Matchers end end -RSpec.configure do |config| - config.include JsonSpec::Matchers +if defined?(MiniTest) + class Minitest::Test + include JsonSpec::Matchers + end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 635ec43..2a4d331 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,3 +1,5 @@ +$LOAD_PATH << ::File.expand_path('../../lib', __FILE__) + require "json_spec" RSpec.configure do |config| diff --git a/test/assertions_test.rb b/test/assertions_test.rb new file mode 100644 index 0000000..faba8b8 --- /dev/null +++ b/test/assertions_test.rb @@ -0,0 +1,29 @@ +require_relative "test_helper" + +class UserToJsonTest < Minitest::Test + def setup + @user = OpenStruct.new id: 42, first_name: "Steve", last_name: "Richert", friends: [] + @names = %({"first_name":"Steve","last_name":"Richert"}) + end + + def test_includes_names + assert_must be_json_eql(@names).excluding("friends"), @user.to_json + end + + def test_includes_id + assert_have_json_path @user.to_json, "id" + assert_must have_json_path("id"), @user.to_json + + assert_must have_json_type(Integer).at_path("id"), @user.to_json + end + + def test_includes_friends + assert_must have_json_size(0).at_path("friends"), @user.to_json + + friend = OpenStruct.new first_name: "Catie", last_name: "Richert" + @user.friends << friend + + assert_must have_json_size(1).at_path("friends"), @user.to_json + assert_must include_json(friend.to_json).at_path("friends"), @user.to_json + end +end diff --git a/test/expectations_test.rb b/test/expectations_test.rb new file mode 100644 index 0000000..e2fc7cd --- /dev/null +++ b/test/expectations_test.rb @@ -0,0 +1,38 @@ +require_relative "test_helper" + +describe "User", :to_json do + let(:user) { OpenStruct.new id: 42, first_name: "Steve", last_name: "Richert", friends: [] } + let(:names) { %({"first_name":"Steve","last_name":"Richert"}) } + subject { user.to_json } + + it "includes names" do + user.to_json.must be_json_eql(names).excluding("friends") + end + + it { must be_json_eql(names).excluding("friends") } + must { be_json_eql(names).excluding("friends") } + + it "includes the ID" do + user.to_json.must have_json_path("id") + user.to_json.must have_json_type(Integer).at_path("id") + end + + it { must have_json_path("id") } + must { have_json_path("id") } + + it { must have_json_type(Integer).at_path("id") } + must { have_json_type(Integer).at_path("id") } + + it "includes friends" do + user.to_json.must have_json_size(0).at_path("friends") + + friend = OpenStruct.new first_name: "Catie", last_name: "Richert" + user.friends << friend + + user.to_json.must have_json_size(1).at_path("friends") + user.to_json.must include_json(friend.to_json).at_path("friends") + end + + it { must have_json_size(0).at_path("friends") } + must { have_json_size(0).at_path("friends") } +end diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..c3eba82 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,14 @@ +$LOAD_PATH << ::File.expand_path('../../lib', __FILE__) + +require "minitest/autorun" +require "minitest/matchers" +require "json_spec" + +# Give OpenStruct support for to_json +require "ostruct" + +class OpenStruct + def to_json *args + table.to_json *args + end +end