From 66a8be526b387cb81ef97334cf21859928703de3 Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Tue, 15 Sep 2015 12:40:01 -0500 Subject: [PATCH] WIP(hourglass): Error catches --- common/locales/en/subscriber.json | 7 +++- common/script/content/index.coffee | 18 ++++------ common/script/index.coffee | 7 ++-- .../common/user.ops.hourglassPurchase.test.js | 34 ++++++++++++------- website/src/routes/apiv2.coffee | 11 +++++- 5 files changed, 48 insertions(+), 29 deletions(-) diff --git a/common/locales/en/subscriber.json b/common/locales/en/subscriber.json index 253812a483..b5a94d47c2 100644 --- a/common/locales/en/subscriber.json +++ b/common/locales/en/subscriber.json @@ -67,5 +67,10 @@ "subUpdateTitle": "Update", "subUpdateDescription": "Update the card to be charged.", "notEnoughHourglasses": "You don't have enough Mystic Hourglasses.", - "hourglassBuyEquipSetConfirm": "Buy this full set of items for 1 Mystic Hourglass?" + "hourglassBuyEquipSetConfirm": "Buy this full set of items for 1 Mystic Hourglass?", + "petsAlreadyOwned": "Pet already owned.", + "mountsAlreadyOwned": "Mount already owned.", + "typeNotAllowedHourglass": "Item type not supported for purchase with Mystic Hourglass. Allowed types: ", + "petsNotAllowedHourglass": "Pet not available for purchase with Mystic Hourglass.", + "mountsNotAllowedHourglass": "Mount not available for purchase with Mystic Hourglass." } diff --git a/common/script/content/index.coffee b/common/script/content/index.coffee index 3a1234de71..300c918b04 100644 --- a/common/script/content/index.coffee +++ b/common/script/content/index.coffee @@ -533,18 +533,12 @@ _.each gearTypes, (type) -> Time Traveler Store, mystery sets need their items mapped in ### _.each api.mystery, (v,k)-> v.items = _.where api.gear.flat, {mystery:k} -api.timeTravelerStore = (owned, category) -> +api.timeTravelerStore = (owned) -> ownedKeys = _.keys owned.toObject?() or owned # mongoose workaround - if not category or category is "mystery" - _.reduce api.mystery, (m,v,k)-> - return m if k=='wondercon' or ~ownedKeys.indexOf(v.items[0].key) # skip wondercon and already-owned sets - m[k] = v;m - , {} - else - _.reduce api.timeTravelStable[category], (m,v,i)-> - returm m if ~ownedKeys.indexOf(v) - m[i] = v;m - , [] + _.reduce api.mystery, (m,v,k)-> + return m if k=='wondercon' or ~ownedKeys.indexOf(v.items[0].key) # skip wondercon and already-owned sets + m[k] = v;m + , {} ### --------------------------------------------------------------- @@ -2052,7 +2046,7 @@ api.quests = ] gp: 0 exp: 650 - + cheetah: text: t('questCheetahText') notes: t('questCheetahNotes') diff --git a/common/script/index.coffee b/common/script/index.coffee index b056552a41..1a1f915d0b 100644 --- a/common/script/index.coffee +++ b/common/script/index.coffee @@ -1019,8 +1019,11 @@ api.wrap = (user, main=true) -> cb? null, _.pick(user,$w 'items purchased.plan.consecutive') hourglassPurchase: (req, cb, analytics)-> - return cb?({code:401, message:i18n.t('notEnoughHourglasses', req.language)}) unless user.purchased.plan.consecutive.trinkets > 0 - + {type, key} = req.params + return cb?({code:400, message:i18n.t('typeNotAllowedHourglass', req.language) + JSON.stringify(_.keys(content.timeTravelStable))}) unless content.timeTravelStable[type] + return cb?({code:400, message:i18n.t(type+'NotAllowedHourglass', req.language)}) if not _.includes(content.timeTravelStable[type], key) + return cb?({code:400, message:i18n.t(type+'AlreadyOwned', req.language)}) if user.items[type][key] + return cb?({code:400, message:i18n.t('notEnoughHourglasses', req.language)}) unless user.purchased.plan.consecutive.trinkets > 0 sell: (req, cb) -> {key, type} = req.params diff --git a/test/common/user.ops.hourglassPurchase.test.js b/test/common/user.ops.hourglassPurchase.test.js index d1b63f4b2c..5603154534 100644 --- a/test/common/user.ops.hourglassPurchase.test.js +++ b/test/common/user.ops.hourglassPurchase.test.js @@ -15,7 +15,8 @@ describe('user.ops.hourglassPurchase', function() { user = { items: { pets: {}, - mounts: {} + mounts: {}, + hatchingPotions: {} }, purchased: { plan: { @@ -33,8 +34,16 @@ describe('user.ops.hourglassPurchase', function() { context('failure conditions', function() { + it('does not allow purchase of unsupported item types', function(done) { + user.ops.hourglassPurchase({params:{type: 'hatchingPotions', key: 'Base'}}, function(response) { + expect(response.message).to.eql("Item type not supported for purchase with Mystic Hourglass. Allowed types: [pets, mounts]"); + expect(user.items.hatchingPotions).to.eql({}); + done(); + }); + }); + it('does not grant pets without Mystic Hourglasses', function(done) { - user.ops.hourglassPurchase({params:{category: 'pets', key: 'MantisShrimp-Base'}}, function(response) { + user.ops.hourglassPurchase({params:{type: 'pets', key: 'MantisShrimp-Base'}}, function(response) { expect(response.message).to.eql("You don't have enough Mystic Hourglasses."); expect(user.items.pets).to.eql({}); done(); @@ -42,20 +51,20 @@ describe('user.ops.hourglassPurchase', function() { }); it('does not grant mounts without Mystic Hourglasses', function(done) { - user.ops.hourglassPurchase({params:{category: 'mounts', key: 'MantisShrimp-Base'}}, function(response) { + user.ops.hourglassPurchase({params:{type: 'mounts', key: 'MantisShrimp-Base'}}, function(response) { expect(response.message).to.eql("You don't have enough Mystic Hourglasses."); expect(user.items.mounts).to.eql({}); done(); }); }); - + it('does not grant pet that has already been purchased', function(done) { user.purchased.plan.consecutive.trinkets = 1; user.items.pets = { 'MantisShrimp-Base': true - }; + }; - user.ops.hourglassPurchase({params:{category: 'pets', key: 'MantisShrimp-Base'}}, function(response) { + user.ops.hourglassPurchase({params:{type: 'pets', key: 'MantisShrimp-Base'}}, function(response) { expect(response.message).to.eql("Pet already owned."); expect(user.purchased.plan.consecutive.trinkets).to.eql(1); done(); @@ -66,9 +75,9 @@ describe('user.ops.hourglassPurchase', function() { user.purchased.plan.consecutive.trinkets = 1; user.items.mounts = { 'MantisShrimp-Base': true - }; + }; - user.ops.hourglassPurchase({params:{category: 'mounts', key: 'MantisShrimp-Base'}}, function(response) { + user.ops.hourglassPurchase({params:{type: 'mounts', key: 'MantisShrimp-Base'}}, function(response) { expect(response.message).to.eql("Mount already owned."); expect(user.purchased.plan.consecutive.trinkets).to.eql(1); done(); @@ -78,7 +87,7 @@ describe('user.ops.hourglassPurchase', function() { it('does not grant pet that is not part of the Time Travel Stable', function(done) { user.purchased.plan.consecutive.trinkets = 1; - user.ops.hourglassPurchase({params: {category: 'pets', key: 'Wolf-Veteran'}}, function(response) { + user.ops.hourglassPurchase({params: {type: 'pets', key: 'Wolf-Veteran'}}, function(response) { expect(response.message).to.eql('Pet not available for purchase with Mystic Hourglass.'); expect(user.purchased.plan.consecutive.trinkets).to.eql(1); done(); @@ -88,7 +97,7 @@ describe('user.ops.hourglassPurchase', function() { it('does not grant mount that is not part of the Time Travel Stable', function(done) { user.purchased.plan.consecutive.trinkets = 1; - user.ops.hourglassPurchase({params: {category: 'mounts', key: 'Orca-Base'}}, function(response) { + user.ops.hourglassPurchase({params: {type: 'mounts', key: 'Orca-Base'}}, function(response) { expect(response.message).to.eql('Mount not available for purchase with Mystic Hourglass.'); expect(user.purchased.plan.consecutive.trinkets).to.eql(1); done(); @@ -101,7 +110,7 @@ describe('user.ops.hourglassPurchase', function() { it('buys a pet', function(done) { user.purchased.plan.consecutive.trinkets = 2; - user.ops.hourglassPurchase({params: {category: 'pets', key: 'MantisShrimp-Base'}}, function() { + user.ops.hourglassPurchase({params: {type: 'pets', key: 'MantisShrimp-Base'}}, function() { expect(user.purchased.plan.consecutive.trinkets).to.eql(1); expect(user.items.pets).to.eql({'MantisShrimp-Base':true}); done(); @@ -111,7 +120,7 @@ describe('user.ops.hourglassPurchase', function() { it('buys a mount', function(done) { user.purchased.plan.consecutive.trinkets = 2; - user.ops.hourglassPurchase({params: {category: 'mounts', key: 'MantisShrimp-Base'}}, function() { + user.ops.hourglassPurchase({params: {type: 'mounts', key: 'MantisShrimp-Base'}}, function() { expect(user.purchased.plan.consecutive.trinkets).to.eql(1); expect(user.items.mounts).to.eql({'MantisShrimp-Base':true}); done(); @@ -120,4 +129,3 @@ describe('user.ops.hourglassPurchase', function() { }); }); }); - diff --git a/website/src/routes/apiv2.coffee b/website/src/routes/apiv2.coffee index db26ac57a7..3757b3142a 100644 --- a/website/src/routes/apiv2.coffee +++ b/website/src/routes/apiv2.coffee @@ -180,13 +180,22 @@ module.exports = (swagger, v2) -> "/user/inventory/purchase/{type}/{key}": spec: method: 'POST' - description: "Purchase a gem-purchaseable item from Alexander" + description: "Purchase a Gem-purchasable item from Alexander" parameters:[ path('type',"The type of object you're purchasing.",'string',['eggs','hatchingPotions','food','quests','special']) path('key',"The object key you're purchasing (call /content route for available keys)",'string') ] action: user.purchase + "/user/inventory/hourglass/{type}/{key}" + spec: + method: 'POST' + description: "Purchase a pet or mount using a Mystic Hourglass" + parameters:[ + path('type',"The type of object you're purchasing.",'string',['pets','mounts']) + path('key',"The object key you're purchasing (call /content route for available keys)",'string') + ] + action: user.hourglassPurchase "/user/inventory/feed/{pet}/{food}": spec: