def test_charge_with_token_should_return_false_exception_message_tuple_when_facades_generic_error_raised(
            self, create_customer):
        # setup
        adapter = MembershipStripeAdapter(self.membership)
        message = u'amessage'
        create_customer.side_effect = StripeFacade.GenericError(message)

        # action
        returned_value = adapter.charge_with_token(self.card_token)

        # assert
        self.assertTupleEqual((False, message,), returned_value)
    def test_charge_should_call_facades_charge_customer_with_stripes_customer_and_memberships_plan_type_price_and_then_assign_stripes_customer_id_to_memberships_customer_id(
            self, stripe_facade_class):
        # setup
        adapter = MembershipStripeAdapter(self.membership)
        customer = mock.Mock()
        facade = stripe_facade_class.return_value

        # action
        adapter.charge(customer)

        # assert
        self.assertTupleEqual((customer, self.membership.plan_type.price,),
            facade.charge_customer.call_args[0])
    def test_charge_should_call_facades_charge_customer_with_stripes_customer_and_memberships_plan_type_price_and_then_assign_stripes_customer_id_to_memberships_customer_id(
            self, stripe_facade_class):
        # setup
        adapter = MembershipStripeAdapter(self.membership)
        customer = mock.Mock()
        facade = stripe_facade_class.return_value

        # action
        adapter.charge(customer)

        # assert
        self.assertTupleEqual((
            customer,
            self.membership.plan_type.price,
        ), facade.charge_customer.call_args[0])
    def test_charge_with_token_should_call_create_customer_when_memeberships_customer_id_is_none_the_call_charge_and_commit_changes_returning_true_none_tuple(
            self, create_customer, charge, commit_changes):
        # setup
        adapter = MembershipStripeAdapter(self.membership)

        # action
        returned_value = adapter.charge_with_token(self.card_token)

        # assert
        self.assertTupleEqual((self.card_token,), create_customer.call_args[0])
        self.assertTupleEqual((create_customer.return_value,),
            charge.call_args[0])
        self.assertTupleEqual((create_customer.return_value,),
            commit_changes.call_args[0])
        self.assertTupleEqual((True, None,), returned_value)
    def test_charge_with_token_should_return_false_exception_message_tuple_when_facades_generic_error_raised(
            self, create_customer):
        # setup
        adapter = MembershipStripeAdapter(self.membership)
        message = u'amessage'
        create_customer.side_effect = StripeFacade.GenericError(message)

        # action
        returned_value = adapter.charge_with_token(self.card_token)

        # assert
        self.assertTupleEqual((
            False,
            message,
        ), returned_value)
    def test_charge_should_call_facades_charge_customer_with_stripes_customer_and_memberships_plant_type_price_with_applied_discount_and_then_assign_stripes_customer_id_to_memberships_customer_id(
            self, stripe_facade_class):
        # setup
        adapter = MembershipStripeAdapter(self.membership)
        coupon_code = mock.Mock()
        coupon_code.discount = decimal.Decimal(5.5)
        self.membership.coupon_code = coupon_code
        customer = mock.Mock()
        facade = stripe_facade_class.return_value

        # action
        adapter.charge(customer)

        # assert
        self.assertTupleEqual(
            (customer, self.membership.plan_type.price - coupon_code.discount,),
            facade.charge_customer.call_args[0])
    def test_commit_changes_should_call_memberships_save(self,
            stripe_facade_class):
        # setup
        adapter = MembershipStripeAdapter(self.membership)
        customer = dict(id=self.customer_id)
        facade = stripe_facade_class.return_value

        # action
        adapter.commit_changes(customer)

        # assert
        self.assertEqual(self.customer_id, self.membership.customer_id)
        self.assertTupleEqual((customer,),
            facade.get_card_last_4_digits.call_args[0])
        self.assertEqual(facade.get_card_last_4_digits.return_value,
            self.membership.cc_last4)
        self.assertEqual(1, adapter.membership.save.call_count)
    def test_commit_changes_should_call_memberships_save(
            self, stripe_facade_class):
        # setup
        adapter = MembershipStripeAdapter(self.membership)
        customer = dict(id=self.customer_id)
        facade = stripe_facade_class.return_value

        # action
        adapter.commit_changes(customer)

        # assert
        self.assertEqual(self.customer_id, self.membership.customer_id)
        self.assertTupleEqual((customer, ),
                              facade.get_card_last_4_digits.call_args[0])
        self.assertEqual(facade.get_card_last_4_digits.return_value,
                         self.membership.cc_last4)
        self.assertEqual(1, adapter.membership.save.call_count)
    def test_get_customer_with_new_token_should_call_facades_get_customer_with_customer_id_the_facades_replace_default_card_with_stripes_customer_and_card_token(
            self, stripe_facade_class):
        # setup
        adapter = MembershipStripeAdapter(self.membership)
        facade = stripe_facade_class.return_value

        # action
        returned_value = adapter.get_customer_with_new_token(
            self.customer_id, self.card_token)

        # assert
        self.assertTupleEqual((self.customer_id,),
            facade.get_customer.call_args[0])
        self.assertTupleEqual(
            (facade.get_customer.return_value, self.card_token,),
            facade.replace_default_card.call_args[0])
        self.assertEqual(id(facade.get_customer.return_value),
            id(returned_value))
    def test_charge_should_call_facades_charge_customer_with_stripes_customer_and_memberships_plant_type_price_with_applied_discount_and_then_assign_stripes_customer_id_to_memberships_customer_id(
            self, stripe_facade_class):
        # setup
        adapter = MembershipStripeAdapter(self.membership)
        coupon_code = mock.Mock()
        coupon_code.discount = decimal.Decimal(5.5)
        self.membership.coupon_code = coupon_code
        customer = mock.Mock()
        facade = stripe_facade_class.return_value

        # action
        adapter.charge(customer)

        # assert
        self.assertTupleEqual((
            customer,
            self.membership.plan_type.price - coupon_code.discount,
        ), facade.charge_customer.call_args[0])
    def test_charge_with_token_should_call_create_customer_when_memeberships_customer_id_is_none_the_call_charge_and_commit_changes_returning_true_none_tuple(
            self, create_customer, charge, commit_changes):
        # setup
        adapter = MembershipStripeAdapter(self.membership)

        # action
        returned_value = adapter.charge_with_token(self.card_token)

        # assert
        self.assertTupleEqual((self.card_token, ),
                              create_customer.call_args[0])
        self.assertTupleEqual((create_customer.return_value, ),
                              charge.call_args[0])
        self.assertTupleEqual((create_customer.return_value, ),
                              commit_changes.call_args[0])
        self.assertTupleEqual((
            True,
            None,
        ), returned_value)
    def test_get_customer_with_new_token_should_call_facades_get_customer_with_customer_id_the_facades_replace_default_card_with_stripes_customer_and_card_token(
            self, stripe_facade_class):
        # setup
        adapter = MembershipStripeAdapter(self.membership)
        facade = stripe_facade_class.return_value

        # action
        returned_value = adapter.get_customer_with_new_token(
            self.customer_id, self.card_token)

        # assert
        self.assertTupleEqual((self.customer_id, ),
                              facade.get_customer.call_args[0])
        self.assertTupleEqual((
            facade.get_customer.return_value,
            self.card_token,
        ), facade.replace_default_card.call_args[0])
        self.assertEqual(id(facade.get_customer.return_value),
                         id(returned_value))
    def test_create_customer_should_facades_create_customer_with_membership_email_metadata_and_card_token(
            self, stripe_facade_class):
        # setup
        adapter = MembershipStripeAdapter(self.membership)
        metadata = dict(first_name=self.membership.first_name,
                        last_name=self.membership.last_name,
                        address=self.membership.address,
                        zip_code=self.membership.zip_code,
                        city=self.membership.city,
                        state=self.membership.state,
                        count=self.membership.country)
        facade = stripe_facade_class.return_value

        # action
        returned_value = adapter.create_customer(self.card_token)

        # assert
        self.assertTupleEqual(
            (self.membership.email, metadata, self.card_token),
            facade.create_customer.call_args[0])
        self.assertEqual(id(facade.create_customer.return_value),
                         id(returned_value))
    def test_create_customer_should_facades_create_customer_with_membership_email_metadata_and_card_token(
            self, stripe_facade_class):
        # setup
        adapter = MembershipStripeAdapter(self.membership)
        metadata = dict(
            first_name=self.membership.first_name,
            last_name=self.membership.last_name,
            address=self.membership.address,
            zip_code=self.membership.zip_code,
            city=self.membership.city,
            state=self.membership.state,
            count=self.membership.country)
        facade = stripe_facade_class.return_value

        # action
        returned_value = adapter.create_customer(self.card_token)

        # assert
        self.assertTupleEqual(
            (self.membership.email, metadata, self.card_token),
            facade.create_customer.call_args[0])
        self.assertEqual(id(facade.create_customer.return_value),
        id(returned_value))