Stockpot
Stockpot
makes setting up test data in your Rails database from an external resource easier.
Stockpot
gives you an easy way to expose a number of end points from your app, enabling CRUD actions that you can utilize from things like a standalone test suite to set up state. For instance, rather than going through the entirety of a new user creation flow just to check that users can update their data once registered, simply make a POST call to /stockpot/database_management
with your dummy user's data, shortcutting that unnecessary setup and enabling you to go to directly checking the system behavior needed.
Use it in your external Cypress or Cucumber tests, set up a webpage to allow manual testers to set up and get state with an interface fronting the API, etc.
Why the name Stockpot
? Keeping with Freshly's food related naming, a stockpot is one of the most common types of cooking pots worldwide, and a stockpot is traditionally use to make stock or broth which can be the basis for cooking more complex recipes. You put ingredients in, do some cooking, and take out a finished product. For this project, think of your database as being the stockpot, putting in test data, doing some action in the system under test, and then pulling out data to use in your assertions of your system's behavior.
Version 0.1.x Notes
Initial development notes: Stockpot is very much a work in progress. The initial implementation is mostly an abstraction of Freshly's current usage of controllers to allow our external Cypress test project to interact with our Rails app's database. The current pie in the sky plan is to genericize things more so that different tools can be used and allow folk's more configuration options.
Installation
Add this line to your application's Gemfile:
gem 'stockpot'
And then execute:
bundle
Or install it yourself as:
gem install stockpot
Usage
Rails App
!! Warning !!
You should only enable this in environments that are **NOT production. If you choose to ignore this warning, do so at your own risk!! Wrap the following in a check for environments with something like Rails.env.test?
if you don't have anything else in place.**
Add the Stockpot
engine to your /config/routes.rb
file, changing the base path if you'd like to:
mount Stockpot::Engine, at: "/stockpot"
This will give you the following routes (assuming the default "/stockpot" path):
/stockpot/records
GET
Query for data. Accepts a array of objects that require at least a model name, but can also include additional qualifying data.
[
{ model: "user" },
{ model: "address" }
]
// or
[
{ model: "user", id: "foo"
]
POST
Create new data. Accepts an an array of objects specifying a single model with additional qualifiers.
- factory (required) - Specify which factory to create a record with.
- list (optional) - Specify a count of items to create, default: 1
- traits (optional) - An array of strings specifying any traits you may want to use with your data. Applies to all records created.
- attributes (optional) - An array of objects allowing for the specification of data to be used when creating records. Array position matches with list order if multiple records are desired.
[{
factory: "user",
traits: ["having_address"],
attributes: [{
email: "[email protected]",
password: "baz",
first_name: "Foo",
last_name: "Bar"
}]
}]
DELETE
Remove data. Accepts the same type of input as GET
PUT
Update data Accepts an array of objects with each object specifying the model type to be updated along with the data to update. Input is uses the same base as GET and DELETE, but also accepts an update
object allowing for the specification of the data to be updated.
[
{
model: "user",
user_id: "123",
update: {
status: "active",
email: "[email protected]"
}
}
]
/stockpot/clean_database
DELETE
Clears Rails & Redis caches and truncates Active Records databases. No body required.
/stockpot/redis
GET
Query for data. Accepts key or field to use to search cache for record.
{
key: "123",
field: "foo"
}
GET - Keys
Query for all keys within data. No body or argument required.
POST - Create new data
Accepts an object specifying a key, field, and value to be inserted into Redis cache.
{
key: "123",
field: "foo",
value: "bar"
}
Cypress/External Suite Examples
We utilize Cypress commands to abstract out helpers for setting up state such as
Cypress.Commands.add("getRecords", args => {
cy.request({
method: "GET",
url: "stockpot/records",
body: {
models: args
}
})
})
Our tests can then call this command like this
cy.getRecords([{ model: "user", id: user.id }])
.then(res => {
expect(newEmail).to.eql(res.body.users[0].email)
})
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run rake spec
to run the tests. To install this gem onto your local machine, run bundle exec rake install
.
See the next section on contributing for more info.
Contributing
This Open Source is supported by Freshly, a company committed to quality code and delicious food.
We're basically always hiring.
Come join us in our New York City, Phoenix, or Minsk offices and write some awesome software!
Community support is always appreciated! Bug reports and pull requests are welcome on GitHub.
Please read our CONTRIBUTING doc for more information!
License
The gem is available as open source under the terms of the MIT License.