Skip to content

Commit

Permalink
Wrote the app code and tests for the CreateStatus action and the requ…
Browse files Browse the repository at this point in the history
…ired entity and jack methods.
  • Loading branch information
brianknapp committed Dec 24, 2012
1 parent 5394f27 commit 3ae84fe
Show file tree
Hide file tree
Showing 11 changed files with 162 additions and 60 deletions.
2 changes: 2 additions & 0 deletions .rspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
--colour
--format nested
4 changes: 4 additions & 0 deletions Guardfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
guard 'rspec', :cli => "--color", :spec_paths => ["app/spec"] do
watch(%r{^app/spec/.+_spec\.rb$})
watch(%r{^app/(.+)\.rb$}) { |m| "app/spec/#{m[1]}_spec.rb" }
end
13 changes: 9 additions & 4 deletions app/actions/create_status.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,22 @@ def initialize status_jack

def do input
# validate input
unless input.has_shape? :user_id => Fixnum, :text => String
raise ArgumentError, 'invalid input format'
end

# set default id and values for new Status entity
input[:id] = -1 # by convention id of -1 will tell the jack save method to create a new row/document/whatever

# create/populate Status object
# use: Status.populate
status = Status.new
status.populate input

# save status to jack
# use: StatusJack.save, Status.to_hash
result = @status_jack.save status.to_hash

# return the result

result
end

end
8 changes: 5 additions & 3 deletions app/contracts/status_jack_contract.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
require 'obvious'

require_relative '../entities/status'

class StatusJackContract < Contract
def self.contracts
["save", "get", "list", "remove"]
['save', 'get', 'list', 'remove']
end

def save_contract input
input_shape = {}
output_shape = {}
input_shape = Status.shape
output_shape = Status.shape
call_method :save_alias, input, input_shape, output_shape
end

Expand Down
28 changes: 25 additions & 3 deletions app/entities/status.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,33 @@
require 'validation'

class Status
include Validation

attr_validator :text, String
attr_validator :user_id, Fixnum
attr_validator :id, Fixnum

# self.shape is useful for contract validation, especially on list and save methods
def self.shape
{
:text => String,
:user_id => Fixnum,
:id => Fixnum
}
end

def populate input
nil
self.text = input[:text]
self.user_id = input[:user_id]
self.id = input[:id]
end

def to_hash input
nil
def to_hash
{
:text => text,
:user_id => user_id,
:id => id
}
end

end
17 changes: 15 additions & 2 deletions app/spec/actions/create_status_spec.rb
Original file line number Diff line number Diff line change
@@ -1,10 +1,23 @@
require_relative '../../actions/create_status'
require_relative '../doubles/status_jack_double'

describe CreateStatus do

it 'should create a status update'
it 'should create a status update' do
input = {
:user_id => 1,
:text => 'making a sandwich'
}
action = CreateStatus.new StatusJackDouble.create :default
result = action.do input
result.should eq :user_id => 1, :text => 'making a sandwich', :id => 1
end

it 'should raise an error with invalid input'
it 'should raise an error with invalid input' do
input = { :user_id => nil, :text => nil }
action = CreateStatus.new StatusJackDouble.create :default
expect { action.do input }.to raise_error ArgumentError
end

end

Expand Down
56 changes: 56 additions & 0 deletions app/spec/contracts/status_jack_contract_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
require_relative '../../contracts/status_jack_contract'
require_relative '../doubles/status_jack_double'

describe StatusJackContract do

describe '.save_contract' do
it 'should save data with valid input' do
input = { :user_id => 1, :text => 'making a sandwich', :id => 1 }
jack = StatusJackDouble.create :default
result = jack.save input
result.should eq :user_id => 1, :text => 'making a sandwich', :id => 1
end

it 'should raise an error with invalid input' do
input = { :user_id => nil, :text => nil, :id => nil }
jack = StatusJackDouble.create :default
expect { jack.save input }.to raise_error ContractInputError
end

it 'should raise an error with invalid output' do
input = { :user_id => 1, :text => 'making a sandwich', :id => 1 }
jack = StatusJackDouble.create :bad_output
expect { jack.save input }.to raise_error ContractOutputError
end

end

describe '.get_contract' do
it 'should get data with valid input'

it 'should raise an error with invalid input'

it 'should raise an error with invalid output'

end

describe '.list_contract' do
it 'should list data with valid input'

it 'should raise an error with invalid input'

it 'should raise an error with invalid output'

end

describe '.remove_contract' do
it 'should remove data with valid input'

it 'should raise an error with invalid input'

it 'should raise an error with invalid output'

end

end

42 changes: 0 additions & 42 deletions app/spec/contracts/status_jack_spec.rb

This file was deleted.

File renamed without changes.
28 changes: 28 additions & 0 deletions app/spec/doubles/status_jack_double.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
require_relative '../../contracts/status_jack_contract'

class StatusJackDouble
def self.create behavior
case behavior
when :bad_output
StatusJack_BadOutput.new
when :default
StatusJack_Default.new
end
end
end

class StatusJack_Default < StatusJackContract

def save input
{ :user_id => 1, :text => 'making a sandwich', :id => 1 }
end

end

class StatusJack_BadOutput < StatusJackContract

def save input
nil
end

end
24 changes: 18 additions & 6 deletions app/spec/entities/status_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,28 @@
describe Status do

describe '.populate' do
it 'should populate with valid input'

it 'should raise an error with invalid input'
it 'should populate with valid input' do
input = { :id => 1, :user_id => 1, :text => 'making a sandwich' }
status = Status.new
status.populate input
status.to_hash.should eq :id => 1, :user_id => 1, :text => 'making a sandwich'
end

it 'should raise an error with invalid input' do
input = { :id => nil, :user_id => nil, :text => nil } # should test other variations, but this is just an example
status = Status.new
expect { status.populate input }.to raise_error Validation::InvalidWritingError
end

end

describe '.to_hash' do
it 'should to_hash with valid input'

it 'should raise an error with invalid input'
it 'should to_hash with valid input' do
input = { :id => 1, :user_id => 1, :text => 'making a sandwich' }
status = Status.new
status.populate input
status.to_hash.should eq :id => 1, :user_id => 1, :text => 'making a sandwich'
end

end

Expand Down

0 comments on commit 3ae84fe

Please sign in to comment.