hubot-ingress
Version:
Ingress commands for Hubot
215 lines (192 loc) • 8.33 kB
text/coffeescript
chai = require 'chai'
sinon = require 'sinon'
chai.use require 'sinon-chai'
expect = chai.expect
describe 'ingress: badges', ->
user =
name: 'user'
id: 'U123'
robot =
respond: sinon.spy()
hear: sinon.spy()
brain:
on: (_, cb) ->
cb()
data: {
ingressBadges: {
U012: [
':ada-1:',
':ada-2:',
':aegis:',
':akira:',
':devra-1:',
':goruckstealh:',
':goruckurban:',
':nl-1331-1:',
':nl-1331-2:',
':oliver-lynton-wolfe-2:',
':p-a-chapeau-2:',
':susanna-moyer1:',
':susanna-moyer2:'
]
}
}
userForName: (who) ->
forName =
name: who
id: 'U234'
beforeEach ->
= user
= robot
= .brain.data
=
send: sinon.spy()
reply: sinon.spy()
envelope:
user:
message:
user:
require('../src/badges')(robot)
it 'updates user badge names when robot brain is loaded', ->
badges = .ingressBadges.U012
badgeUpdateMapVersion = .ingressBadgeNameUpdateVersion
expect(badges).to.be.a('array')
expect(badges).to.include(':ada:')
expect(badges).to.include(':ada-2016:')
expect(badges).to.include(':aegis-nova:')
expect(badges).to.include(':akira-tsukasa:')
expect(badges).to.include(':devra-bogdanovich:')
expect(badges).to.include(':goruck-stealth:')
expect(badges).to.include(':goruck-urban:')
expect(badges).to.include(':nl-1331:')
expect(badges).to.include(':nl-1331-2016:')
expect(badges).to.include(':oliver-lynton-wolfe-2016:')
expect(badges).to.include(':p-a-chapeau-2016:')
expect(badges).to.include(':susanna-moyer:')
expect(badges).to.include(':susanna-moyer-2016:')
expect(badgeUpdateMapVersion).to.equal 1
it 'registers "have badge" listener', ->
expect(.respond).to.have.been.calledWith(/(@?[.\w\-]+) (?:have|has|got|earned)(?: the)? :?([\-\w,\s]+):? badges?/i)
it 'registers "what badges" listener', ->
expect(.respond).to.have.been.calledWith(/wh(?:at|ich) badges? do(?:es)? (@?[.\w\-]+) have/i)
it 'registers "do not have" listener', ->
expect(.respond).to.have.been.calledWith(/(@?[.\w\-]+) (?:do(?:n't|esn't| not)) have the :?([\-\w]+):? badge/i)
it 'responds to "I have the founder badge"', ->
.match = [0, 'I', 'founder']
.respond.args[0][1]()
badges = .ingressBadges.U123
expect(.reply).to.have.been.calledWith('congrats on earning the :founder: badge!')
expect(badges).to.be.a('array')
expect(badges).to.include(':founder:')
it 'responds to "I have the oliver-lynton-wolfe badge"', ->
.match = [0, 'I', 'oliver-lynton-wolfe']
.respond.args[0][1]()
badges = .ingressBadges.U123
expect(.reply).to.have.been.calledWith('congrats on earning the :oliver-lynton-wolfe: badge!')
expect(badges).to.be.a('array')
expect(badges).to.include(':oliver-lynton-wolfe:')
it 'responds to "I have the black guardian badge"', ->
.match = [0, 'I', 'black guardian']
.respond.args[0][1]()
badges = .ingressBadges.U123
expect(.reply).to.have.been.calledWith('congrats on earning the :guardian5: badge!')
expect(badges).to.be.a('array')
expect(badges).to.include(':guardian5:')
it 'responds to "I have the guardian badge"', ->
.match = [0, 'I', 'guardian']
.respond.args[0][1]()
badges = .ingressBadges.U123
expect(.reply).to.have.been.calledWith('congrats on earning the :guardian1: badge!')
expect(badges).to.be.a('array')
expect(badges).to.include(':guardian1:')
it 'responds with error message on invalid badge name', ->
.match = [0, 'I', 'random']
.respond.args[0][1]()
badges = .ingressBadges.U123
expect(.reply).to.have.been.calledWith('invalid badge name(s): random1.')
expect(badges).to.be.a('array')
expect(badges).not.to.include(':random1:')
it '"I have" automatically replaces badge of same type', ->
.match = [0, 'I', 'hacker1']
.respond.args[0][1]()
badges = .ingressBadges.U123
expect(.reply).to.have.been.calledWith('congrats on earning the :hacker1: badge!')
expect(badges).to.be.a('array')
expect(badges).to.include(':hacker1:')
.match = [0, 'I', 'hacker2']
.respond.args[0][1]()
badges = .ingressBadges.U123
expect(.reply).to.have.been.calledWith('congrats on earning the :hacker2: badge!')
expect(badges).to.be.a('array')
expect(badges).not.to.include(':hacker1:')
expect(badges).to.include(':hacker2:')
it '"I have" can handle multiple badge names', ->
.match = [0, 'I', 'pioneer3, hacker4, builder1, oliver-lynton-wolfe']
.respond.args[0][1]()
badges = .ingressBadges.U123
expect(.reply).to.have.been.calledWith(sinon.match(/congrats on earning the .* badges!/))
expect(badges).to.be.a('array')
expect(badges).to.include(':pioneer3:')
expect(badges).to.include(':hacker4:')
expect(badges).to.include(':builder1:')
expect(badges).to.include(':oliver-lynton-wolfe:')
it '"I have" can handle multiple character badges when the respective character has an old and new badge', ->
.match = [0, 'I', 'susanna-moyer, susanna-moyer-2016']
.respond.args[0][1]()
badges = .ingressBadges.U123
expect(badges).to.be.a('array')
expect(badges).to.include(':susanna-moyer:')
expect(badges).to.include(':susanna-moyer-2016:')
it '"I have" doesn\'t attempt to add an anomaly or character badge that has already been added', ->
.match = [0, 'I', 'shonin']
.respond.args[0][1]()
.respond.args[0][1]()
badges = .ingressBadges.U123
expect(badges).to.be.a('array')
expect(badges).to.include(':shonin:')
expect(badges).to.satisfy((bdgs) -> (bdgs.filter (x) -> x == ':shonin:').length == 1)
it 'responds to "user2 has the verified badge"', ->
.match = [0, 'user2', 'verified']
.respond.args[0][1]()
badges = .ingressBadges.U234
expect(.send).to.have.been.calledWith('@user2: congrats on earning the :verified: badge!')
expect(badges).to.be.a('array')
expect(badges).to.include(':verified:')
it 'responds to "what badges do I have"', ->
.match = [0, 'I']
.respond.args[1][1]()
expect(.reply).to.have.been.calledWith(sinon.match(/You have (the following|no) badges.*/))
it 'responds to "what badges does user2 have"', ->
.match = [0, 'user2']
.respond.args[1][1]()
expect(.reply).to.have.been.calledWith(sinon.match(/user2 has (the following|no) badges.*/))
it 'responds to "I don\'t have the founder badge"', ->
.match = [0, 'I', 'founder']
.respond.args[2][1]()
badges = .ingressBadges.U123
expect(.reply).to.have.been.calledWith('removed the :founder: badge')
expect(badges).not.to.include(':founder:')
describe 'handles usernames with special characters [@-.]', ->
it '(user-2)', ->
.match = [0, 'user-2', 'verified']
.respond.args[0][1]()
badges = .ingressBadges.U234
expect(badges).to.be.a('array')
expect(badges).to.include(':verified:')
expect(.send).to.have.been.calledWith('@user-2: congrats on earning the :verified: badge!')
it '(user.2)', ->
.match = [0, 'user.2', 'verified']
.respond.args[0][1]()
badges = .ingressBadges.U234
expect(badges).to.be.a('array')
expect(badges).to.include(':verified:')
expect(.send).to.have.been.calledWith('@user.2: congrats on earning the :verified: badge!')
it '(@user2)', ->
.match = [0, '@user2', 'verified']
.respond.args[0][1]()
badges = .ingressBadges.U234
expect(badges).to.be.a('array')
expect(badges).to.include(':verified:')
expect(.send).to.have.been.calledWith('@user2: congrats on earning the :verified: badge!')