UNPKG

@getoccasion/sdk

Version:

An SDK library that enables access to Occasion's application, providing a rich DSL for creating and managing bookings.

910 lines (778 loc) 30.9 kB
describe('Occasion.Order', function() { beforeEach(function() { this.occsnClient = Occasion.Client({ token: 'my_token' }) moxios.install(this.occsnClient.interface.axios) window.onSuccess = jasmine.createSpy('onSuccess') window.onFailure = jasmine.createSpy('onFailure') window.onCompletion = jasmine.createSpy('onCompletion') }) afterEach(function() { moxios.uninstall() }) describe('attendees / quantity matching', function() { beforeEach(function() { this.occsnClient.Product.find('1kbsdf').then(window.onSuccess) this.promise = moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Product.attendees) .then(() => { this.product = window.onSuccess.calls.mostRecent().args[0] }) }) this.promise2 = this.promise.then(() => { this.occsnClient.Order.create({ product: this.product }).then(window.onSuccess) return moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Order.attendees) .then(() => { this.order = window.onSuccess.calls.mostRecent().args[0] }) }) }) }) it('builds attendees to match size to quantity', function() { return this.promise2.then(() => { expect(this.order.attendees().size()).toEqual(2) }) }) describe('lowering quantity', () => { beforeEach(function() { this.promise3 = this.promise2.then(() => { this.order.save().then(window.onSuccess) return moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Order.no_attendees) .then(() => { this.order = window.onSuccess.calls.mostRecent().args[0] }) }) }) }) it('pops attendees to match size to quantity', function() { return this.promise3.then(() => { expect(this.order.attendees().size()).toEqual(0) }) }) }) }) describe('construct', function() { describe('when product requires time slot selection', function() { beforeEach(function() { this.occsnClient.Product.find('1kbsdf').then(window.onSuccess) var _this = this this.promise = moxios.wait(function() { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Product.find.success) .then(function() { _this.product = window.onSuccess.calls.mostRecent().args[0] }) }) this.promise2 = this.promise.then(function() { _this.occsnClient.Order.construct({ product: _this.product }).then(window.onSuccess) return moxios.wait(function() { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Question.all.success) .then(function() { _this.order = window.onSuccess.calls.mostRecent().args[0] }) }) }) }) it('assigns a session identifier', function() { var _this = this return this.promise2.then(function() { expect(_this.order.sessionIdentifier.length).not.toEqual(0) }) }) it('builds a customer', function() { var _this = this return this.promise2.then(function() { expect(_this.order.customer().attributes()).toEqual({ email: null, firstName: null, lastName: null, zip: null }) }) }) it('loads product questions', function() { return this.promise2.then(function() { expect(moxios.requests.mostRecent().url).toEqual( encodeURI( 'https://example.com/api/v1/products/1/questions/?include=options&page[size]=500' ) ) }) }) it('populates blank answers for each question', function() { var _this = this return this.promise2.then(function() { var questionIds = _this.order .answers() .target() .map(function(t) { return t.question().id }) .toArray() expect(questionIds).toEqual(['1', '2', '3', '4']) }) }) it('populates answer.option with default option for drop_down', function() { var _this = this return this.promise2.then(function() { var answer = _this.order .answers() .target() .detect(function(t) { return t.question().formControl == 'drop_down' }) expect(answer.option().default).toEqual(true) }) }) it('populates answer.option with default option for option_list', function() { var _this = this return this.promise2.then(function() { var answer = _this.order .answers() .target() .detect(function(t) { return t.question().formControl == 'option_list' }) expect(answer.option().default).toEqual(true) }) }) it('populates answer.value with min for spin_button', function() { var _this = this return this.promise2.then(function() { var answer = _this.order .answers() .target() .detect(function(t) { return t.question().formControl == 'spin_button' }) expect(answer.value).toEqual(1) }) }) }) describe('when product does not require time slot selection', function() { describe('when timeSlots.size == 1', function() { beforeEach(function() { this.occsnClient.Product.find('1kbsdf').then(window.onSuccess) this.promise = moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Product.one_time_slot) .then(() => { this.product = window.onSuccess.calls.mostRecent().args[0] }) }) moxios.stubRequest(/.+\/questions.*/, JsonApiResponses.Question.all.success) moxios.stubRequest(/.+\/time_slots.*/, JsonApiResponses.TimeSlot.single) this.promise2 = this.promise.then(() => { this.occsnClient.Order.construct({ product: this.product }).then(window.onSuccess) return moxios.wait(() => { this.order = window.onSuccess.calls.mostRecent().args[0] }) }) }) it('assigns order.timeSlots to the only product timeSlot', function() { return this.promise2.then(() => { expect(this.order.timeSlots().size()).toEqual(1) }) }) }) describe('when sellsSessions', function() { beforeEach(function() { this.occsnClient.Product.find('1kbsdf').then(window.onSuccess) this.promise = moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Product.session) .then(() => { this.product = window.onSuccess.calls.mostRecent().args[0] }) }) moxios.stubRequest(/.+\/questions.*/, JsonApiResponses.Question.all.success) moxios.stubRequest(/.+\/time_slots.*/, JsonApiResponses.TimeSlot.index) this.promise2 = this.promise.then(() => { this.occsnClient.Order.construct({ product: this.product }).then(window.onSuccess) return moxios.wait(() => { this.order = window.onSuccess.calls.mostRecent().args[0] }) }) }) it('assigns order.timeSlots to all product timeSlots', function() { return this.promise2.then(() => { expect(this.order.timeSlots().size()).toEqual(10) }) }) }) }) describe('when product blank', function() { beforeEach(function() { this.occsnClient.Order.construct().then(window.onCompletion) this.promise3 = moxios.wait(() => { this.order = window.onCompletion.calls.mostRecent().args[0] }) }) it('still builds order', function() { return this.promise3.then(() => { expect(this.order.isA(this.occsnClient.Order)).toBeTruthy() }) }) }) }) describe('decimal attributes', function() { beforeEach(function() { this.occsnClient.Order.create().then(window.onCompletion) this.promise = moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Order.find.success) .then(() => { this.order = window.onCompletion.calls.mostRecent().args[0] }) }) }) it('wraps subtotal in Decimal', function() { return this.promise.then(() => { expect(this.order.subtotal.toFixed).toBeDefined() }) }) it('wraps couponAmount in Decimal', function() { return this.promise.then(() => { expect(this.order.couponAmount.toFixed).toBeDefined() }) }) it('wraps tax in Decimal', function() { return this.promise.then(() => { expect(this.order.tax.toFixed).toBeDefined() }) }) it('wraps giftCardAmount in Decimal', function() { return this.promise.then(() => { expect(this.order.giftCardAmount.toFixed).toBeDefined() }) }) it('wraps price in Decimal', function() { return this.promise.then(() => { expect(this.order.price.toFixed).toBeDefined() }) }) it('wraps outstandingBalance in Decimal', function() { return this.promise.then(() => { expect(this.order.outstandingBalance.toFixed).toBeDefined() }) }) it('wraps dropInsDiscount in Decimal', function() { return this.promise.then(() => { expect(this.order.dropInsDiscount.toFixed).toBeDefined() }) }) it('wraps serviceFee in Decimal', function() { return this.promise.then(() => { expect(this.order.serviceFee.toFixed).toBeDefined() }) }) }) describe('transactions', function() { describe('charging', function() { beforeEach(function() { this.order = this.occsnClient.Order.build() this.paymentMethod = this.occsnClient.CreditCard.build({ id: 'cc_token' }) }) describe('charge', function() { beforeEach(function() { this.order.charge(this.paymentMethod, 10.0) }) it('adds transaction', function() { expect(this.order.transactions().size()).toEqual(1) }) it('adds amount to transaction', function() { expect( this.order .transactions() .target() .first().amount ).toEqual(10.0) }) it('adds paymentMethod transaction', function() { expect( this.order .transactions() .target() .first() .paymentMethod() ).toEqual(this.paymentMethod) }) }) describe('editCharge', function() { beforeEach(function() { this.order.charge(this.paymentMethod, 10.0) this.order.editCharge(this.paymentMethod, 1000.0) }) it("changes payment method's transaction amount", function() { expect( this.order .transactions() .target() .first().amount ).toEqual(1000.0) }) }) describe('removeCharge', function() { beforeEach(function() { this.order.charge(this.paymentMethod, 10.0) this.order.removeCharge(this.paymentMethod) }) it('removes the charge', function() { expect(this.order.transactions().empty()).toBeTruthy() }) }) }) describe('changing outstandingBalance', function() { beforeEach(function() { this.occsnClient.Product.find('1kbsdf').then(window.onSuccess) this.promise = moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Product.find.success) .then(() => { this.product = window.onSuccess.calls.mostRecent().args[0] }) }) }) describe('one gift card', function() { beforeEach(function() { this.promise2 = this.promise.then(() => { this.occsnClient.Order.create({ product: this.product }).then(window.onSuccess) return moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Order.gift_cards) .then(() => { this.order = window.onSuccess.calls.mostRecent().args[0] }) }) }) }) describe('raising balance', function() { describe('sufficient gift card value', function() { beforeEach(function() { this.promise3 = this.promise2.then(() => { this.giftCardTransaction = this.order.charge( this.occsnClient.GiftCard.build({ id: '1', value: 3.0 }), '2.0' ) this.giftCardTransaction.id = 'giftCard' this.creditCardTransaction = this.order.charge( this.occsnClient.CreditCard.build({ id: 'cc_token' }), '0.0' ) this.creditCardTransaction.id = 'creditCard' this.order.save().then(window.onSuccess) return moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Order.higher_price) .then(() => { this.order = window.onSuccess.calls.mostRecent().args[0] this.giftCardTransaction2 = this.order .transactions() .target() .detect(t => t.id == 'giftCard') this.creditCardTransaction2 = this.order .transactions() .target() .detect(t => t.id == 'creditCard') }) }) }) }) it('charges gift card more', function() { return this.promise3.then(() => { expect(this.giftCardTransaction2.amount).toEqual('3') }) }) it('clones transaction', function() { return this.promise3.then(() => { expect(this.giftCardTransaction2).not.toBe(this.giftCardTransaction) }) }) it('uses original order as cloned transaction inverse', function() { return this.promise3.then(() => { expect(this.giftCardTransaction2.order()).toBe(this.order) }) }) it('does not charge credit card more', function() { return this.promise3.then(() => { expect(this.creditCardTransaction2.amount).toEqual('0') }) }) it('changes order.giftCardAmount to match new total', function() { return this.promise3.then(() => { expect(this.order.giftCardAmount.toString()).toEqual('3') }) }) }) describe('insufficient gift card value', function() { beforeEach(function() { this.promise3 = this.promise2.then(() => { this.giftCardTransaction = this.order.charge( this.occsnClient.GiftCard.build({ id: '1', value: 2.0 }), '2' ) this.giftCardTransaction.id = 'giftCard' this.creditCardTransaction = this.order.charge( this.occsnClient.CreditCard.build({ id: 'cc_token' }), '0' ) this.creditCardTransaction.id = 'creditCard' this.order.save().then(window.onSuccess) return moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Order.higher_price) .then(() => { this.order = window.onSuccess.calls.mostRecent().args[0] this.giftCardTransaction2 = this.order .transactions() .target() .detect(t => t.id == 'giftCard') this.creditCardTransaction2 = this.order .transactions() .target() .detect(t => t.id == 'creditCard') }) }) }) }) it('does not charge gift card more', function() { return this.promise3.then(() => { expect(this.giftCardTransaction2.amount).toEqual('2') }) }) it('does not clone gift card transaction', function() { return this.promise3.then(() => { expect(this.giftCardTransaction2).toBe(this.giftCardTransaction) }) }) it('charges credit card more', function() { return this.promise3.then(() => { expect(this.creditCardTransaction2.amount).toEqual('1') }) }) it('clones credit card transaction', function() { return this.promise3.then(() => { expect(this.creditCardTransaction2).not.toBe(this.creditCardTransaction) }) }) it('uses original order as cloned transaction inverse', function() { return this.promise3.then(() => { expect(this.creditCardTransaction2.order()).toBe(this.order) }) }) it('does not change order.giftCardAmount', function() { return this.promise3.then(() => { expect(this.order.giftCardAmount.toString()).toEqual('2') }) }) }) }) describe('lowering balance', function() { beforeEach(function() { this.promise3 = this.promise2.then(() => { this.giftCardTransaction = this.order.charge( this.occsnClient.GiftCard.build({ id: '1', value: 3.0 }), '2' ) this.giftCardTransaction.id = 'giftCard' this.creditCardTransaction = this.order.charge( this.occsnClient.CreditCard.build({ id: 'cc_token' }), '0' ) this.creditCardTransaction.id = 'creditCard' this.order.save().then(window.onSuccess) return moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Order.lower_price) .then(() => { this.order = window.onSuccess.calls.mostRecent().args[0] this.giftCardTransaction2 = this.order .transactions() .target() .detect(t => t.id == 'giftCard') this.creditCardTransaction2 = this.order .transactions() .target() .detect(t => t.id == 'creditCard') }) }) }) }) it('charges gift card less', function() { return this.promise3.then(() => { expect(this.giftCardTransaction2.amount).toEqual('1') }) }) it('clones gift card transaction', function() { return this.promise3.then(() => { expect(this.giftCardTransaction2).not.toBe(this.giftCardTransaction) }) }) it('uses original order as cloned transaction inverse', function() { return this.promise3.then(() => { expect(this.giftCardTransaction2.order()).toBe(this.order) }) }) it('changes order.giftCardAmount to match new total', function() { return this.promise3.then(() => { expect(this.order.giftCardAmount.toString()).toEqual('1') }) }) }) describe('removing balance', function() { beforeEach(function() { this.promise3 = this.promise2.then(() => { this.giftCardTransaction = this.order.charge( this.occsnClient.GiftCard.build({ id: '1', value: 3.0 }), '2' ) this.creditCardTransaction = this.order.charge( this.occsnClient.CreditCard.build({ id: 'cc_token' }), '0' ) this.order.save().then(window.onSuccess) return moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Order.no_balance) .then(() => { this.order = window.onSuccess.calls.mostRecent().args[0] }) }) }) }) it('removes gift card charge', function() { return this.promise3.then(() => { expect( this.order .transactions() .target() .detect(t => t.paymentMethod().isA(this.occsnClient.GiftCard)) ).toBeUndefined() }) }) it('changes order.giftCardAmount to match new total', function() { return this.promise3.then(() => { expect(this.order.giftCardAmount.toString()).toEqual('0') }) }) }) }) describe('two gift cards', function() { beforeEach(function() { this.promise2 = this.promise.then(() => { this.occsnClient.Order.create({ product: this.product }).then(window.onSuccess) return moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Order.gift_cards) .then(() => { this.order = window.onSuccess.calls.mostRecent().args[0] }) }) }) }) describe('raising balance', function() { describe('sufficient gift card value', function() { beforeEach(function() { this.promise3 = this.promise2.then(() => { this.order.charge(this.occsnClient.GiftCard.build({ id: '1', value: 1.0 }), '1') this.giftCardTransaction = this.order.charge( this.occsnClient.GiftCard.build({ id: '2', value: 2.0 }), '1' ) this.giftCardTransaction.id = 'giftCard' this.creditCardTransaction = this.order.charge( this.occsnClient.CreditCard.build({ id: 'cc_token' }), '0' ) this.creditCardTransaction.id = 'creditCard' this.order.save().then(window.onSuccess) return moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Order.higher_price) .then(() => { this.order = window.onSuccess.calls.mostRecent().args[0] this.giftCardTransaction2 = this.order .transactions() .target() .detect(t => t.id == 'giftCard') this.creditCardTransaction2 = this.order .transactions() .target() .detect(t => t.id == 'creditCard') }) }) }) }) it('charges last gift card more', function() { return this.promise3.then(() => { expect(this.giftCardTransaction2.amount).toEqual('2') }) }) it('clones gift card transaction', function() { return this.promise3.then(() => { expect(this.giftCardTransaction2).not.toBe(this.giftCardTransaction) }) }) it('uses original order as cloned transaction inverse', function() { return this.promise3.then(() => { expect(this.giftCardTransaction2.order()).toBe(this.order) }) }) it('does not charge credit card more', function() { return this.promise3.then(() => { expect(this.creditCardTransaction2.amount).toEqual('0') }) }) it('changes order.giftCardAmount to match new total', function() { return this.promise3.then(() => { expect(this.order.giftCardAmount.toString()).toEqual('3') }) }) }) describe('insufficient gift card value', function() { beforeEach(function() { this.promise3 = this.promise2.then(() => { this.order.charge(this.occsnClient.GiftCard.build({ id: '1', value: 1.0 }), '1') this.giftCardTransaction = this.order.charge( this.occsnClient.GiftCard.build({ id: '2', value: 1.0 }), '1' ) this.giftCardTransaction.id = 'giftCard' this.creditCardTransaction = this.order.charge( this.occsnClient.CreditCard.build({ id: 'cc_token' }), '0' ) this.creditCardTransaction.id = 'creditCard' this.order.save().then(window.onSuccess) return moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Order.higher_price) .then(() => { this.order = window.onSuccess.calls.mostRecent().args[0] this.giftCardTransaction2 = this.order .transactions() .target() .detect(t => t.id == 'giftCard') this.creditCardTransaction2 = this.order .transactions() .target() .detect(t => t.id == 'creditCard') }) }) }) }) it('does not charge gift card more', function() { return this.promise3.then(() => { expect(this.giftCardTransaction2.amount).toEqual('1') }) }) it('does not clone gift card transaction', function() { return this.promise3.then(() => { expect(this.giftCardTransaction2).toBe(this.giftCardTransaction) }) }) it('charges credit card more', function() { return this.promise3.then(() => { expect(this.creditCardTransaction2.amount).toEqual('1') }) }) it('does not change order.giftCardAmount', function() { return this.promise3.then(() => { expect(this.order.giftCardAmount.toString()).toEqual('2') }) }) }) }) describe('lowering balance', function() { beforeEach(function() { this.promise3 = this.promise2.then(() => { this.giftCardTransaction1 = this.order.charge( this.occsnClient.GiftCard.build({ id: '1', value: 1.0 }), '1' ) this.giftCardTransaction2 = this.order.charge( this.occsnClient.GiftCard.build({ id: '2', value: 1.0 }), '1' ) this.giftCardTransaction1.id = 'giftCard1' this.giftCardTransaction2.id = 'giftCard2' this.creditCardTransaction = this.order.charge( this.occsnClient.CreditCard.build({ id: 'cc_token' }), '0' ) this.creditCardTransaction.id = 'creditCard' this.order.save().then(window.onSuccess) return moxios.wait(() => { return moxios.requests .mostRecent() .respondWith(JsonApiResponses.Order.lower_price2) .then(() => { this.order = window.onSuccess.calls.mostRecent().args[0] this.giftCardTransaction3 = this.order .transactions() .target() .detect(t => t.id == 'giftCard1') this.giftCardTransaction4 = this.order .transactions() .target() .detect(t => t.id == 'giftCard2') this.creditCardTransaction2 = this.order .transactions() .target() .detect(t => t.id == 'creditCard') }) }) }) }) it('charges gift cards less', function() { return this.promise3.then(() => { expect(this.giftCardTransaction3.amount).toEqual('0.5') }) }) it('removes gift card with no balance', function() { return this.promise3.then(() => { expect(this.giftCardTransaction4).toBeUndefined() }) }) it('clones changed gift card transaction', function() { return this.promise3.then(() => { expect(this.giftCardTransaction3).not.toBe(this.giftCardTransaction1) }) }) it('does not charge credit card more', function() { return this.promise3.then(() => { expect(this.creditCardTransaction2.amount).toEqual('0') }) }) it('changes order.giftCardAmount to match new total', function() { return this.promise3.then(() => { expect(this.order.giftCardAmount.toString()).toEqual('0.5') }) }) }) }) }) }) })