示例#1
0
def test_patch_to_group_default(client, dbsession, maximal_contact):
    """PATCH to default values deletes a group."""
    email_id = maximal_contact.email.email_id
    email = get_email(dbsession, email_id)
    assert email.vpn_waitlist

    patch_data = {"vpn_waitlist": {"geo": None, "platform": None}}
    resp = client.patch(f"/ctms/{email_id}",
                        json=patch_data,
                        allow_redirects=True)
    assert resp.status_code == 200
    actual = resp.json()
    assert actual["vpn_waitlist"] == {"geo": None, "platform": None}

    email = get_email(dbsession, email_id)
    assert not email.vpn_waitlist
示例#2
0
def test_get_email(dbsession, example_contact):
    """An email is retrieved in two queries, and newsletters are sorted by name."""
    email_id = example_contact.email.email_id
    with StatementWatcher(dbsession.connection()) as watcher:
        email = get_email(dbsession, email_id)
    assert watcher.count == 2, watcher.statements
    assert email.email_id == email_id
    with StatementWatcher(dbsession.connection()) as watcher:
        newsletter_names = [newsletter.name for newsletter in email.newsletters]
        assert newsletter_names == ["firefox-welcome", "mozilla-welcome"]
        assert sorted(newsletter_names) == newsletter_names
    assert watcher.count == 0, watcher.statements
示例#3
0
def test_get_email_with_stripe_customer(dbsession, contact_with_stripe_customer):
    """An email with a Stripe subscription retrieved in three queries."""
    email_id = contact_with_stripe_customer.email.email_id
    with StatementWatcher(dbsession.connection()) as watcher:
        email = get_email(dbsession, email_id)
    assert watcher.count == 3, watcher.statements
    assert email.email_id == email_id
    newsletter_names = [newsletter.name for newsletter in email.newsletters]
    assert newsletter_names == ["firefox-welcome", "mozilla-welcome"]
    assert sorted(newsletter_names) == newsletter_names

    with StatementWatcher(dbsession.connection()) as watcher:
        assert email.stripe_customer.stripe_id == FAKE_STRIPE_ID["Customer"]
        assert len(email.stripe_customer.subscriptions) == 0
    assert watcher.count == 0, watcher.statements
示例#4
0
def contact_with_stripe_subscription(dbsession, contact_with_stripe_customer):
    create_stripe_price(
        dbsession, StripePriceCreateSchema(**SAMPLE_STRIPE_DATA["Price"])
    )
    create_stripe_subscription(
        dbsession, StripeSubscriptionCreateSchema(**SAMPLE_STRIPE_DATA["Subscription"])
    )
    create_stripe_subscription_item(
        dbsession,
        StripeSubscriptionItemCreateSchema(**SAMPLE_STRIPE_DATA["SubscriptionItem"]),
    )
    dbsession.commit()
    email = get_email(dbsession, contact_with_stripe_customer.email.email_id)
    contact_with_stripe_customer.products = get_stripe_products(email)
    return contact_with_stripe_customer
示例#5
0
def stripe_objects(dbsession, example_contact, maximal_contact):
    """
    Create two complete trees of Stripe objects.

    We don't use ForeignKeys for Stripe relations, because the object may come
    out of order for foreign key contraints. This helps check that the manually
    created relationships are correct.

    When following a relationship, look for this warning in the logs:
    SAWarning: Multiple rows returned with uselist=False for lazily-loaded attribute

    This suggests that SQLAlchemy is joining tables without a limiting WHERE clause,
    and the first item will be returned rather than the related item.
    """
    # Create prices / products
    # Both customers are subscribed to all four, 2 per subscription
    prices = []
    for price_idx in range(4):
        price_data = SAMPLE_STRIPE_DATA["Price"].copy()
        price_data["stripe_id"] = fake_stripe_id("price", f"price_{price_idx}")
        price_data["stripe_product_id"] = fake_stripe_id("prod", f"prod_{price_idx}")
        prices.append(
            create_stripe_price(dbsession, StripePriceCreateSchema(**price_data))
        )

    objs = []
    for contact_idx, contact in enumerate((example_contact, maximal_contact)):
        email_id = contact.email.email_id
        email = get_email(dbsession, email_id)
        obj = {
            "email_id": email_id,
            "contact": email,
            "customer": None,
            "subscription": [],
            "invoice": [],
        }
        objs.append(obj)

        # Create Customer data
        cus_data = SAMPLE_STRIPE_DATA["Customer"].copy()
        cus_data["stripe_id"] = fake_stripe_id("cus", f"cus_{contact_idx}")
        cus_data["fxa_id"] = contact.fxa.fxa_id
        obj["customer"] = create_stripe_customer(
            dbsession, StripeCustomerCreateSchema(**cus_data)
        )

        # Create Subscriptions / Invoices and related items
        for sub_inv_idx in range(2):
            sub_data = SAMPLE_STRIPE_DATA["Subscription"].copy()
            sub_data["stripe_id"] = fake_stripe_id(
                "sub", f"cus_{contact_idx}_sub_{sub_inv_idx}"
            )
            sub_data["stripe_customer_id"] = cus_data["stripe_id"]
            sub_obj = {
                "obj": create_stripe_subscription(
                    dbsession, StripeSubscriptionCreateSchema(**sub_data)
                ),
                "items": [],
            }
            obj["subscription"].append(sub_obj)

            inv_data = SAMPLE_STRIPE_DATA["Invoice"].copy()
            inv_data["stripe_id"] = fake_stripe_id(
                "sub", f"cus_{contact_idx}_inv_{sub_inv_idx}"
            )
            inv_data["stripe_customer_id"] = cus_data["stripe_id"]
            inv_obj = {
                "obj": create_stripe_invoice(
                    dbsession, StripeInvoiceCreateSchema(**inv_data)
                ),
                "line_items": [],
            }
            obj["invoice"].append(inv_obj)

            for item_idx in range(2):
                price = prices[sub_inv_idx * 2 + item_idx]

                si_data = SAMPLE_STRIPE_DATA["SubscriptionItem"].copy()
                si_data["stripe_id"] = fake_stripe_id(
                    "si", f"cus_{contact_idx}_sub_{sub_inv_idx}_si_{item_idx}"
                )
                si_data["stripe_price_id"] = price.stripe_id
                si_data["stripe_subscription_id"] = sub_data["stripe_id"]
                sub_obj["items"].append(
                    {
                        "obj": create_stripe_subscription_item(
                            dbsession, StripeSubscriptionItemCreateSchema(**si_data)
                        ),
                        "price": price,
                    }
                )

                li_data = SAMPLE_STRIPE_DATA["InvoiceLineItem"].copy()
                li_data["stripe_id"] = fake_stripe_id(
                    "il", f"cus_{contact_idx}_inv_{sub_inv_idx}_il_{item_idx}"
                )
                li_data["stripe_invoice_id"] = inv_data["stripe_id"]
                li_data["stripe_price_id"] = price.stripe_id
                li_data["stripe_subscription_id"] = sub_data["stripe_id"]
                li_data["stripe_subscription_item_id"] = si_data["stripe_id"]
                inv_obj["line_items"].append(
                    {
                        "obj": create_stripe_invoice_line_item(
                            dbsession, StripeInvoiceLineItemCreateSchema(**li_data)
                        ),
                        "price": price,
                    }
                )
    dbsession.commit()
    return objs
示例#6
0
def test_get_email_miss(dbsession):
    """A missed email is one query."""
    with StatementWatcher(dbsession.connection()) as watcher:
        email = get_email(dbsession, str(uuid4()))
    assert watcher.count == 1
    assert email is None