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
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
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
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
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
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