# mongoid-minitest
MiniTest matchers for Mongoid.
[![Build Status](https://secure.travis-ci.org/frodsan/mongoid-minitest.png?branch=master&.png)](http://travis-ci.org/frodsan/mongoid-minitest)
## Support
This gem supports:
* Ruby 1.9.3
* Mongoid ~>3.0.4
* MiniTest ~>3.3.0
If you're using Mongoid 2.4.x, you should use [0.0.3.1 version](https://github.com/frodsan/mongoid-minitest/tree/274976e8814cc9bfb3f1c83eba1bed21fa3cf26b).
## Installation
Add this line to your application's Gemfile:
gem "mongoid-minitest"
And then execute:
$ bundle
Or install it yourself as:
$ gem install mongoid-minitest
## Usage
Matchers are available at `Mongoid::Matchers` module.
Setup matchers according to your testing preference:
### minitest/unit
class MiniTest::Unit::TestCase
include Mongoid::Matchers
end
### minitest/spec
class MiniTest::Spec
include Mongoid::Matchers
end
See the following examples:
# minitest/unit
class DummyTest < MiniTest::Unit::TestCase
def test_matchers
assert_must Dummy, have_field(:name)
assert_wont Dummy, have_field(:none)
end
end
# minitest/spec
describe Dummy
it "should test matchers" do
Dummy.must have_field(:name)
Dummy.wont have_field(:none)
end
end
# minitest/spec with subject
describe Dummy
it { must have_field(:name) }
it { wont have_field(:none) }
end
## Matchers
`Mongoid::Matchers` include the following modules:
Module Mongoid
Module Matchers
include Document
include Validations
include Associations
end
end
### Document Matchers
describe Mongoid::Matchers::Document do
subject { Person }
it { must be_document } # if model includes Mongoid::Document
it { must be_paranoid } # if model includes Mongoid::Paranoia
it { must be_versioned } # if model includes Mongoid::Versioning
it { must be_timestamped } # if model includes Mongoid::Timestamps
it { must be_stored_in(:people) } # checks the collection for model's document
it { must have_field(:name) }
it { must have_field(:name).of_type(String) }
it { must have_field(:name).with_default_value("me") }
it { must have_field(:name).of_type(String).with_default_value("me") }
it { must have_fields(:name, :login) }
it { must have_fields(:name, :login).of_type(String) }
it { must have_fields(:name, :login).with_default_value("me") }
it { must have_fields(:name, :login).of_type(String).with_default_value("me") }
it { must have_index_for(:name) }
end
### Validation Matchers
describe Mongoid::Matchers::Validations do
subject { Person }
it { must validate_presence_of(:name) }
it { must validate_uniqueness_of(:login).case_insensitive }
it { must validate_uniqueness_of(:login).scoped_to(:site) }
it { must validate_length_of(:login).in(5..12) }
it { must validate_length_of(:login).within(5..12) }
it { must validate_length_of(:password).with_min(8) }
it { must validate_length_of(:password).with_minimum(8) }
it { must validate_length_of(:password).with_max(16) }
it { must validate_length_of(:password).with_maximum(16) }
it { must validate_format_of(:email).to_allow("foo@bar.com") }
it { must validate_format_of(:email).to_not_allow("foo_bar_com") }
it { must validate_inclusion_of(:role).to_allow("user", "admin") }
it { must validate_exclusion_of(:email).to_not_allow("foo@bar.com", "fizz@buzz.com") }
it { must validate_confirmation_of(:password) }
it { must validate_acceptance_of(:terms_of_use).accept_with("1") }
it { must validate_associated(:pets) }
# Testing validators custom messages
it { must validate_presence_of(:role).with_message("no role") }
it { must validate_length_of(:password).with_min(8).with_message("len >= 8") }
end
### Association Matchers
describe Mongoid::Matchers::Associations do
describe Person do
subject { Person }
it { must have_one(:account) }
it { must have_many(:pets).of_type(Pet) }
it { must have_and_belong_to_many(:friends) }
it { must embed_one(:profile) }
it { must embed_many(:sites) }
end
describe Pet do
subject { Pet }
it { must belong_to(:person) }
end
describe Site do
subject { Site }
it { must embedded_in(:person) }
end
end
## Contributing
1. Fork it.
2. Create your feature branch (`git checkout -b my-new-feature`).
3. Commit your changes (`git commit -am 'Added some feature'`).
4. Push to the branch (`git push origin my-new-feature`).
5. Create new Pull Request.
## Unit Tests
To run unit tests, run `bundle exec rake`.
## Maintainers
* Francesco Rodriguez ().
* Sascha Wessel ().
## License
MIT License. Copyright 2012 Francesco Rodriguez. See [LICENSE](https://github.com/frodsan/lego/blob/master/LICENSE)
for more information.