- Read Tutorial
In this guide we'll create a Client
class for our microservice so that applications attempting to communicate with the Notification
service will need to be authorized. To begin we'll build a model test in RSpec.
touch spec/models/client_spec.rb
Creating the RSpec Tests
Now let's add a base case test for creating a new Client
:
# spec/models/client_spec.rb require 'rails_helper' RSpec.describe Client, type: :model do describe 'creation' do it 'can be created' do client = FactoryGirl.build_stubbed(:client) expect(client).to be_valid end end end
This is pretty basic, so I added a few components here, running rspec
will give us some expected errors, first and foremost we don't have a model called Client
so it renders the following:
Generating the Model
Let's fix this error by generating a model:
rails g model Client source_app:string api_key:string
Make sure to skip the default behavior of RSpec so it doesn't override our test by entering in n
when it asks if we want to replace the test file. Now run bundle exec rake db:migrate
to update the database schema. Now if you run rspec
you'll see that we're back to green.
You may wonder how the tests are passing, because our test calls for a Client
factory. If you look at the model generator you'll see that it actually created a factory for us automatically, which is a nice built in feature.
MacBook-Pro-3:message_service admin$ rails g model Client source_app:string api_key:string Running via Spring preloader in process 25256 invoke active_record create db/migrate/20160704214150_create_clients.rb create app/models/client.rb invoke rspec conflict spec/models/client_spec.rb Overwrite /Users/admin/code/message_service/spec/models/client_spec.rb? (enter "h" for help) [Ynaqdh] n skip spec/models/client_spec.rb invoke factory_girl create spec/factories/clients.rb
Let's update the values in the factory:
# spec/factories/clients.rb FactoryGirl.define do factory :client do source_app "my_app" api_key "RbZHfHtD1h9XZvs4fGPJUgtt" end end
I was able to get the api_key
value by going into the rails console
and entering in the command SecureRandom.base64.tr('+/=', 'Qrt')
. This will be the command we use in our Client
api_key_generator
method so I wanted to use a value similar to what the app will actually use.
Implementing Validations
As you may have guessed we need to make sure that clients
always have both values, so let's mark them as required. Let's add the tests into the model spec file:
# spec/models/client_spec.rb describe 'validations' do it 'can not be created if not valid' do client = FactoryGirl.build_stubbed(:client) client.source_app = nil client.api_key = nil expect(client).to_not be_valid end end
Let's get this test passing by adding the appropriate code in the model file:
# app/models/client.rb class Client < ActiveRecord::Base validates_presence_of :source_app, :api_key end
Now if we run the tests the tests are all back to green.
Let's make one small refactor and move the client = FactoryGirl.build_stubbed(:client)
into a before
block to remove the duplicate code.
# spec/models/client_spec.rb require 'rails_helper' RSpec.describe Client, type: :model do before do @client = FactoryGirl.build_stubbed(:client) end describe 'creation' do it 'can be created' do expect(@client).to be_valid end end describe 'validations' do it 'can not be created if not valid' do @client = FactoryGirl.build_stubbed(:client) @client.source_app = nil @client.api_key = nil expect(@client).to_not be_valid end end end
Up Next
Ok, this is coming along nicely. With our Client
class setup, in the next guide we're going to perform a slightly advanced task where we override the default ActiveRecord
behavior and connect our Client
and Notification
models with a different foreign key than the id
.