def test_run_next_month_order_already(datetime_m1, datetime_m2, app,
                                      user_notified_shipped_order_20150530,
                                      user, user_address):
    datetime_m1.utcnow.return_value = datetime(2017, 5, 30, 13, 13, 13, 13)
    datetime_m1.side_effect = lambda *args, **kwargs: datetime(*args, **kwargs)
    datetime_m2.utcnow.return_value = datetime_m1.utcnow.return_value
    datetime_m2.side_effect = datetime_m1.side_effect
    user_id = user.id

    manager = OrderManager(user_notified_shipped_order_20150530.id)
    manager.run_action(SET_USER_RECEIVED_ACTION)

    with patch('core.order.order_manager.run_order') as run_order_m:
        # Test
        run_scheduled_orders()

        # Check
        user = get_user(user_id)
        assert len(user.orders) == 2
        next_month_order = [
            o for o in user.orders
            if o.id != user_notified_shipped_order_20150530.id
        ]
        assert len(next_month_order) == 1

        run_order_m.delay.assert_called_once_with(next_month_order[0].id)
def test_dont_run_next_month_order_subscription_suspended(
        datetime_m1, datetime_m2, app, user_notified_shipped_order_20150530,
        user, user_address):
    datetime_m1.utcnow.return_value = datetime(2017, 5, 30, 13, 13, 13, 13)
    datetime_m1.side_effect = lambda *args, **kwargs: datetime(*args, **kwargs)
    datetime_m2.utcnow.return_value = datetime_m1.utcnow.return_value
    datetime_m2.side_effect = datetime_m1.side_effect
    user_id = user.id

    user.primary_user_subscription.state = SUBSCRIPTION_SUSPENDED_STATE
    db.session.commit()

    manager = OrderManager(user_notified_shipped_order_20150530.id)
    manager.run_action(SET_USER_RECEIVED_ACTION)

    with patch('core.order.order_manager.run_order') as run_order_m:
        # Test
        run_scheduled_orders()

        # Check
        user = get_user(user_id)
        assert len(user.orders) == 2
        next_month_order = [
            o for o in user.orders
            if o.id != user_notified_shipped_order_20150530.id
        ]
        assert len(next_month_order) == 1

        run_order_m.delay.assert_not_called()
def test_run_action_exception(create_product_offers_m, support_mail_m,
                              send_mail_m, requests_m, app, wine_expert, order,
                              user_address, shipping_rate, salestax_rate):
    send_mail_m.side_effect = Exception

    result = MagicMock()
    result.status_code = 200
    requests_m.get.return_value = result

    manager = OrderManager(order.id)

    # Test
    manager.run_action()

    # Check
    assert order.action is None
    assert order.state == NOTIFY_WINE_EXPERT_EXCEPTION_STATE

    states = [o.state for o in order.order_history]
    assert states == [
        STARTED_STATE,
        READY_TO_PROPOSE_STATE,
        NOTIFY_WINE_EXPERT_EXCEPTION_TO_NOTIFY_STATE,
        NOTIFY_WINE_EXPERT_EXCEPTION_STATE,
    ]

    order_url = get_admin_order_url(order.id)
    send_mail_m.assert_called_once_with(
        wine_expert.email, 'New Order',
        'New order %s is available here: %s' % (order.id, order_url))
    support_mail_m.assert_called_once()
    create_product_offers_m.assert_called_once_with(order.id,
                                                    requests_m.get().json())
def test_run_action_after_placed(boto3_m, send_push_m, boto_m, stripe_m, app,
                                 placed_order, placed_product_offer, user,
                                 user_address, device_token,
                                 placed_offer_item):
    """After order is shipped charge must be captured and notification sent to the User"""
    client_m = MagicMock()
    boto3_m.client.return_value = client_m
    charge = MagicMock()
    stripe_m.Charge.retrieve.return_value = charge

    manager = OrderManager(placed_order.id)

    # Test
    manager.run_action(SET_SHIPPED_ACTION)

    # Check
    assert placed_order.action is None
    assert placed_order.state == USER_NOTIFIED_SHIPPED_STATE

    states = [o.state for o in placed_order.order_history]
    assert states == [
        STARTED_STATE, ORDER_PLACED_STATE, ORDER_SHIPPED_STATE,
        MONEY_CAPTURED_STATE, USER_NOTIFIED_SHIPPED_STATE
    ]

    send_push_m.assert_called_once()
    call_args = send_push_m.call_args[0]

    assert call_args[0] == boto_m.client()
    assert call_args[1] == device_token.token

    body_dct = json.loads(call_args[2])
    apns_dct = json.loads(body_dct['APNS'])
    assert apns_dct == {
        "aps": {
            "alert": "Your order is shipped!",
            "badge": 1,
            "domain": "magia.com",
            "subscriptionId": placed_order.id
        }
    }

    stripe_m.Charge.retrieve.assert_called_once_with(
        placed_product_offer.stripe_charge_id)
    charge.capture.assert_called_once()

    client_m.send_templated_email.assert_called_once()
def test_create_order(app, user, user_subscription, user_address):
    # Test
    OrderManager.create_order(user.id, user_subscription.id)

    # Check
    order = db.session.query(Order).filter_by(user_id=user.id).first()
    order_history = db.session.query(OrderHistory).filter_by(
        order_id=order.id).first()
    subscription_snapshot = db.session.query(
        UserSubscriptionSnapshot).filter_by(order_id=order.id).first()

    assert order.state == STARTED_STATE
    assert order_history.state == STARTED_STATE

    for f in ('type', 'bottle_qty', 'budget'):
        assert getattr(subscription_snapshot, f) == \
               getattr(user_subscription, f)
def test_run_search_action_exception(requests_m, send_mail_m, app, wine_expert,
                                     order, user, user_address,
                                     user_subscription2, source_1, source_2,
                                     theme_1, theme_2, theme_3, shipping_rate,
                                     salestax_rate, shipping_rate_2,
                                     salestax_rate_2):
    user.primary_user_subscription.type = user_subscription2.type
    user.selected_themes.extend([theme_1, theme_2, theme_3])
    db.session.commit()

    result = MagicMock()
    result.status_code = 400
    result.text = 'error'
    requests_m.get.return_value = result

    manager = OrderManager(order.id)

    # Test
    manager.run_action()

    requests_m.get.assert_called_with('/api/search',
                                      params={
                                          'number_wines':
                                          2,
                                          'wine_types':
                                          '["red"]',
                                          'themes':
                                          json.dumps([theme_2.id, theme_3.id]),
                                          'sources_budget':
                                          '{"%s": 82, "%s": 73}' %
                                          (source_1.id, source_2.id),
                                          'sent_wines':
                                          '[]'
                                      })

    # Check
    assert order.action is None
    assert order.state == SEARCH_EXCEPTION_STATE

    states = [o.state for o in order.order_history]
    assert states == [
        STARTED_STATE, SEARCH_EXCEPTION_TO_NOTIFY_STATE, SEARCH_EXCEPTION_STATE
    ]
def test_next_month_order_long_time_ago(datetime_m, app,
                                        user_notified_shipped_order_20150530,
                                        user, user_address):
    """
    After order is completed new order should be created and scheduled for right now
    (simulating the case when the user's subscription was inactive for a very long time and now was activated)
    """
    datetime_m.utcnow.return_value = datetime(2017, 5, 30, 13, 13, 13, 13)
    datetime_m.side_effect = lambda *args, **kwargs: datetime(*args, **kwargs)

    manager = OrderManager(user_notified_shipped_order_20150530.id)

    # Test
    manager.run_action(SET_USER_RECEIVED_ACTION)

    # Check
    assert user_notified_shipped_order_20150530.action is None
    assert user_notified_shipped_order_20150530.state == COMPLETED_STATE

    states = [
        o.state for o in user_notified_shipped_order_20150530.order_history
    ]
    assert states == [
        STARTED_STATE,
        USER_NOTIFIED_SHIPPED_STATE,
        USER_RECEIVED_STATE,
        COMPLETED_STATE,
    ]

    assert len(user.orders) == 2
    next_month_order = [
        o for o in user.orders
        if o.id != user_notified_shipped_order_20150530.id
    ]
    assert len(next_month_order) == 1

    assert next_month_order[0].state == STARTED_STATE
    assert next_month_order[0].scheduled_for == datetime(
        2017, 5, 30, 13, 13, 13, 13)
def test_run_action_after_approved(boto3_m, send_push_m, boto_m, app,
                                   order_proposed, user, user_address,
                                   device_token):
    client_m = MagicMock()
    boto3_m.client.return_value = client_m
    manager = OrderManager(order_proposed.id)

    # Test
    manager.run_action(APPROVE_ACTION)

    # Check
    assert order_proposed.action is None
    assert order_proposed.state == PROPOSED_TO_USER_STATE

    month = get_order_creation_month(order_proposed)
    msg = f'Your {month} wine selections are available! Please confirm quickly to ensure availability.'

    send_push_m.assert_called_once_with(
        boto_m.client(), device_token.token,
        '{"APNS": "{\\"aps\\": {\\"alert\\": \\"%s\\", \\"badge\\": 1, \\"domain\\": \\"magia.com\\"}}",'
        ' "default": "%s"}' % (msg, msg))
    client_m.send_templated_email.assert_called_once()
def test_place_order(boto3_mail_m, boto3_push_m, send_push_m, app,
                     support_notified_order, accepted_product_offer,
                     accepted_offer_item, device_token):
    client_mail_m = MagicMock()
    boto3_mail_m.client.return_value = client_mail_m

    client_push_m = MagicMock()
    boto3_push_m.client.return_value = client_push_m

    # Test
    OrderManager(support_notified_order.id).run_action(PLACE_ORDER_ACTION)

    # Check
    client_mail_m.send_templated_email.assert_called_once()
    send_push_m.assert_called_once_with(
        client_push_m, device_token.token,
        '{"APNS": "{\\"aps\\": {\\"content-available\\": 1, \\"domain\\": \\"magia.com\\", \\"sound\\": \\"\\"}}"}'
    )

    assert support_notified_order.action is None
    assert support_notified_order.state == ORDER_PLACED_STATE
Example #10
0
def test_run_action_after_started(create_product_offers_m, send_mail_m,
                                  requests_m, app, wine_expert, order, user,
                                  user_address, user_subscription2, source_1,
                                  source_2, theme_1, theme_2, theme_3,
                                  shipping_rate, salestax_rate,
                                  shipping_rate_2, salestax_rate_2):
    user.primary_user_subscription.type = user_subscription2.type
    user.first_name = 'tuser new (updated) name'
    user_address.street1 = 'new (updated) street 1'
    user_address.street2 = 'new (updated) street 2'
    user_address.country = 'new (updated) country'
    user_address.city = 'new (updated) city'
    user_address.postcode = 1235
    user.phone = '+123212721237'
    user.selected_themes.extend([theme_1, theme_2, theme_3])
    db.session.commit()

    result = MagicMock()
    result.status_code = 200
    requests_m.get.return_value = result

    manager = OrderManager(order.id)

    # Test
    manager.run_action()

    requests_m.get.assert_called_with('/api/search',
                                      params={
                                          'number_wines':
                                          2,
                                          'wine_types':
                                          '["red"]',
                                          'themes':
                                          json.dumps([theme_2.id, theme_3.id]),
                                          'sources_budget':
                                          '{"%s": 82, "%s": 73}' %
                                          (source_1.id, source_2.id),
                                          'sent_wines':
                                          '[]'
                                      })

    # Check
    assert order.action is None
    assert order.state == PROPOSED_TO_WINE_EXPERT_STATE

    states = [o.state for o in order.order_history]
    assert states == [
        STARTED_STATE, READY_TO_PROPOSE_STATE, PROPOSED_TO_WINE_EXPERT_STATE
    ]

    # Make sure SearchAction updates order shipping info with latest data
    assert order.subscription.type == 'red'
    assert order.shipping_name == 'tuser new (updated) name'
    assert order.shipping_street1 == 'new (updated) street 1'
    assert order.shipping_street2 == 'new (updated) street 2'
    assert order.shipping_country == 'new (updated) country'
    assert order.shipping_city == 'new (updated) city'
    assert order.shipping_postcode == 1235
    assert order.shipping_phone == '+123212721237'

    order_url = get_admin_order_url(order.id)
    send_mail_m.assert_called_once_with(
        wine_expert.email, 'New Order',
        'New order %s is available here: %s' % (order.id, order_url))
    create_product_offers_m.assert_called_once_with(order.id,
                                                    requests_m.get().json())