Skip to content

Commit

Permalink
Track initial set of LawError subtypes, tests
Browse files Browse the repository at this point in the history
  • Loading branch information
ranweiler committed Sep 18, 2013
1 parent 663554b commit 6ae5132
Show file tree
Hide file tree
Showing 3 changed files with 161 additions and 1 deletion.
48 changes: 48 additions & 0 deletions lib/errors.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
error = require 'tea-error'

# Create a constructor for better errors
LawError = error 'LawError'

# subtypes = [
# 'FailedArgumentLookup'
# 'MissingArgument'
# 'InvalidArgument'
# ]
#

# Lots of copy-paste code, obvious shared structure in the class
# definitions below. Can this be factored out in a CS-idiomatic way?

class FailedArgumentLookupError extends LawError
name: 'LawError/FailedArgumentLookup'

constructor: (message, properties, callee) ->
message = message or "Unspecified #{@name}"

super message, properties, callee


class MissingArgumentError extends LawError
name: 'LawError/MissingArgument'

constructor: (message, properties, callee) ->
message = message or "Unspecified #{@name}"

super message, properties, callee


class InvalidArgumentError extends LawError
name: 'LawError/InvalidArgument'

constructor: (message, properties, callee) ->
message = message or "Unspecified #{@name}"

super message, properties, callee


module.exports = {
LawError
FailedArgumentLookupError
MissingArgumentError
InvalidArgumentError
}
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"main":"./index.js",

"dependencies":{
"coffee-script":"*"
"coffee-script":"*",
"tea-error":"*"
},
"devDependencies":{
"mocha":"*",
Expand Down
111 changes: 111 additions & 0 deletions test/errors.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
should = require 'should'

{
LawError
FailedArgumentLookupError
MissingArgumentError
InvalidArgumentError
} = require '../lib/errors'


describe 'errors', ->
describe 'LawError', ->
beforeEach (done) ->
@err = new LawError()
done()

it 'should be an instance of Error', (done) ->
(@err instanceof Error).should.be.true
done()

it 'should be an instance of LawError', (done) ->
(@err instanceof LawError).should.be.true
done()

describe 'FailedArgumentLookupError', ->
describe 'an instance without any passed arguments', ->
beforeEach (done) ->
@err = new FailedArgumentLookupError()
done()

describe 'inheriting from LawError', ->
it 'should be an instance of Error', (done) ->
(@err instanceof Error).should.be.true
done()

it 'should be an instance of LawError', (done) ->
(@err instanceof LawError).should.be.true
done()

it 'should be an instance of FailedArgumentLookupError', (done) ->
(@err instanceof FailedArgumentLookupError).should.be.true
done()

it 'should inherit Error, tea-error properties', (done) ->
should.exist @err.toJSON
should.exist @err.message
should.exist @err.stack
done()

it 'should have a reasonable default message', (done) ->
expectedMessage = 'Unspecified LawError/FailedArgumentLookup'
@err.message.should.equal expectedMessage
done()

describe 'an instance with passed arguments', ->
beforeEach (done) ->
@message = 'Could not look up required argument `username`'
@properties =
serviceName: 'doSomething'
args:
sessionId: 'deadbeef'
timestamp: Date.now()
@err = new FailedArgumentLookupError @message, @properties
done()

it 'should have a correct, descriptive message', (done) ->
should.exist @err.message
@err.message.should.equal @message
done()

it 'should have the properties we gave it', (done) ->
@err.should.include @properties
done()

describe 'MissingArgumentError', ->
beforeEach (done) ->
@message = 'Missing required argument `username`'
@properties =
serviceName: 'doSomething'
args:
sessionId: 'deadbeef'
timestamp: Date.now()
@err = new MissingArgumentError @message, @properties
done()

it 'should be an instance of MissingArgumentError', (done) ->
(@err instanceof MissingArgumentError).should.be.true
done()

it 'should have a correct, descriptive message', (done) ->
@err.message.should.equal @message
done()

describe 'InvalidArgumentError', ->
beforeEach (done) ->
@message = 'Invalid argument `sessionId`'
@properties =
serviceName: 'doSomething'
args:
sessionId: 'malformed'
timestamp: Date.now()
@err = new InvalidArgumentError @message, @properties
done()

it 'should be an instance of InvalidArgumentError', (done) ->
(@err instanceof InvalidArgumentError).should.be.true
done()

it 'should have a correct, descriptive message', (done) ->
@err.message.should.equal @message
done()

0 comments on commit 6ae5132

Please sign in to comment.