From 8a8887b46758eb67732250bdc172959c835aa52b Mon Sep 17 00:00:00 2001 From: Travis Vachon Date: Thu, 19 Dec 2024 15:25:19 -0800 Subject: [PATCH 1/2] feat: clean up tests and split them move the HTTP API tests to their own module and create a new module for the cronjob also DRY up the HTTP request logic --- test/cron.spec.ts | 57 ++++++++++++++ test/http.spec.ts | 108 +++++++++++++++++++++++++++ test/index.spec.ts | 181 --------------------------------------------- 3 files changed, 165 insertions(+), 181 deletions(-) create mode 100644 test/cron.spec.ts create mode 100644 test/http.spec.ts delete mode 100644 test/index.spec.ts diff --git a/test/cron.spec.ts b/test/cron.spec.ts new file mode 100644 index 0000000..7b8b202 --- /dev/null +++ b/test/cron.spec.ts @@ -0,0 +1,57 @@ +// test/index.spec.ts +import { env, createExecutionContext, SELF } from 'cloudflare:test'; +import { describe, it, expect, beforeAll } from 'vitest'; +import { calculateConversionsAndCredits } from '../src/index'; +import { createRefcode, createReferral } from '../src/db'; +import Stripe from 'stripe' + + +function useDummyStripeEnvironmentConstants () { + const referrerEmail = 'referrer@example.com' + const referralEmail = 'referral@example.com' + return { referrerEmail, referralEmail } +} + +async function createDummyStripeEnvironment (stripe: Stripe) { + const { referralEmail, referrerEmail } = useDummyStripeEnvironmentConstants() + const referralStripeCustomer = await stripe.customers.create({ email: referralEmail }) + const referrerStripeCustomer = await stripe.customers.create({ email: referrerEmail }) + return ({ + referralEmail, referrerEmail, referralStripeCustomer, referrerStripeCustomer + }) +} + +async function cleanupDummyStripeEnvironment (stripe: Stripe) { + const { referrerEmail, referralEmail } = useDummyStripeEnvironmentConstants() + for (const email of [referralEmail, referrerEmail]) { + const result = await stripe.customers.search({ query: `email:"${email}"` }) + for (const customer of result.data) { + await stripe.customers.del(customer.id) + } + } +} + +async function resetDummyStripeEnvironment (stripe: Stripe) { + await cleanupDummyStripeEnvironment(stripe) + await createDummyStripeEnvironment(stripe) +} + +// TODO: Work in Progress +// I'm trying to use Stripe sandboxes to create a static remote environment reliable enough for testing +// the credits and conversions reconciliation logic but haven't finished yet - TBD after we get v1 out the door +describe.skip('conversion and credit cronjob', () => { + it('checks stripe', async () => { + const stripe = new Stripe(env.STRIPE_API_KEY) + // uncomment this to reset the stripe environment + // await resetDummyStripeEnvironment(stripe) + const { referralEmail, referrerEmail } = useDummyStripeEnvironmentConstants() + const refcode = await createRefcode(env.REFERRALS, referrerEmail) + await createReferral(env.REFERRALS, referralEmail, refcode) + await stripe.customers.search({ query: `email:"${referralEmail}"` }) + //const stripeCustomer = await stripe.customers.create({email: referralEmail}) + + await calculateConversionsAndCredits({} as ScheduledController, env, createExecutionContext()) + + }) + +}) \ No newline at end of file diff --git a/test/http.spec.ts b/test/http.spec.ts new file mode 100644 index 0000000..6719248 --- /dev/null +++ b/test/http.spec.ts @@ -0,0 +1,108 @@ +// test/index.spec.ts +import { SELF } from 'cloudflare:test'; +import { describe, it, expect } from 'vitest'; + +async function createRefcode(email: string){ + const form = new FormData() + form.append('email', email) + return SELF.fetch('http://example.com/refcode/create', + { method: 'POST', body: form } + ); +} + +async function createReferral(refcode: string, email: string){ + return SELF.fetch('http://example.com/referrals/create', + { + method: 'POST', + body: (() => { + const form = new FormData() + form.append('refcode', refcode) + form.append('email', email) + return form + })() + } + ) +} + +async function getReferrals(refcode: string){ + return SELF.fetch(`http://example.com/referrals/${encodeURIComponent(refcode)}`) +} + +async function getRefcode(email: string){ + return SELF.fetch(`http://example.com/refcode/${encodeURIComponent(email)}`) +} + +async function getReferredBy(email: string){ + return SELF.fetch(`http://example.com/referredby/${encodeURIComponent(email)}`); +} + +describe('the referral service', () => { + it('creates a refcode successfully', async () => { + const email = 'test@example.com' + const createResponse = await createRefcode(email) + expect(await createResponse.json()).toHaveProperty('refcode'); + + const getResponse = await getRefcode(email); + expect(await getResponse.json()).toHaveProperty('refcode'); + }); + + it('creates a referral successfully', async () => { + + // create a refcode + const email = 'test@example.com' + const createRefcodeResponse = await createRefcode(email); + const refcode = (await createRefcodeResponse.json() as any).refcode as string + + // there shouldn't be any referrals yet + let referralsResponse = await getReferrals(refcode); + let referralsResponseJson = await referralsResponse.json() as any + expect(referralsResponseJson).toHaveProperty('referrals'); + expect(referralsResponseJson.referrals).toBeInstanceOf(Array); + expect(referralsResponseJson.referrals).toHaveLength(0) + + // create a referral + const newUserEmail = 'newuser@example.com' + await createReferral(refcode, newUserEmail) + + // now there should be one referral + referralsResponse = await getReferrals(refcode) + referralsResponseJson = await referralsResponse.json() as any + expect(referralsResponseJson).toHaveProperty('referrals'); + expect(referralsResponseJson.referrals).toBeInstanceOf(Array); + expect(referralsResponseJson.referrals).toHaveLength(1) + + const referredByResponse = await getReferredBy(newUserEmail) + const referredByResponseJson = await referredByResponse.json() as any + expect(referredByResponseJson).toHaveProperty('refcode') + + // create a second referral + const secondNewUserEmail = 'secondnewuser@example.com' + await createReferral(refcode, secondNewUserEmail); + + // now there should be two referrals + referralsResponse = await getReferrals(refcode) + referralsResponseJson = await referralsResponse.json() as any + expect(referralsResponseJson).toHaveProperty('referrals'); + expect(referralsResponseJson.referrals).toBeInstanceOf(Array); + expect(referralsResponseJson.referrals).toHaveLength(2) + + const secondReferredByResponse = await getReferredBy(secondNewUserEmail) + const secondReferredByResponseJson = await secondReferredByResponse.json() as any + expect(secondReferredByResponseJson).toHaveProperty('refcode') + }); + + it('will not create a referral for the user who created the refcode', async () => { + + // create a refcode + const email = 'test@example.com' + const form = new FormData() + form.append('email', email) + const createRefcodeResponse = await createRefcode(email) + const refcode = (await createRefcodeResponse.json() as any).refcode as string + + const response = await createReferral(refcode, email) + expect(response.status).toBe(400) + }) +}); + + diff --git a/test/index.spec.ts b/test/index.spec.ts deleted file mode 100644 index 05afe30..0000000 --- a/test/index.spec.ts +++ /dev/null @@ -1,181 +0,0 @@ -// test/index.spec.ts -import { env, createExecutionContext, SELF } from 'cloudflare:test'; -import { describe, it, expect, beforeAll } from 'vitest'; -import { calculateConversionsAndCredits } from '../src/index'; -import { createRefcode, createReferral } from '../src/db'; -import Stripe from 'stripe' - -describe('the referral service', () => { - it('creates a refcode successfully', async () => { - const email = 'test@example.com' - const form = new FormData() - form.append('email', email) - const createResponse = await SELF.fetch('http://example.com/refcode/create', - { method: 'POST', body: form } - ); - expect(await createResponse.json()).toHaveProperty('refcode'); - - const getResponse = await SELF.fetch(`http://example.com/refcode/${encodeURIComponent(email)}`); - expect(await getResponse.json()).toHaveProperty('refcode'); - }); - - it('creates a referral successfully', async () => { - - // create a refcode - const email = 'test@example.com' - const form = new FormData() - form.append('email', email) - const createRefcodeResponse = await SELF.fetch('http://example.com/refcode/create', - { - method: 'POST', - body: (() => { - const form = new FormData() - form.append('email', email) - return form - })() - } - ); - const refcode = (await createRefcodeResponse.json() as any).refcode as string - - // there shouldn't be any referrals yet - let referralsResponse = await SELF.fetch(`http://example.com/referrals/${encodeURIComponent(refcode)}`); - let referralsResponseJson = await referralsResponse.json() as any - expect(referralsResponseJson).toHaveProperty('referrals'); - expect(referralsResponseJson.referrals).toBeInstanceOf(Array); - expect(referralsResponseJson.referrals).toHaveLength(0) - - // create a referral - const newUserEmail = 'newuser@example.com' - await SELF.fetch('http://example.com/referrals/create', - { - method: 'POST', - body: (() => { - const form = new FormData() - form.append('refcode', refcode) - form.append('email', newUserEmail) - return form - })() - } - ); - - // now there should be one referral - referralsResponse = await SELF.fetch(`http://example.com/referrals/${encodeURIComponent(refcode)}`); - referralsResponseJson = await referralsResponse.json() as any - expect(referralsResponseJson).toHaveProperty('referrals'); - expect(referralsResponseJson.referrals).toBeInstanceOf(Array); - expect(referralsResponseJson.referrals).toHaveLength(1) - - const referredByResponse = await SELF.fetch(`http://example.com/referredby/${encodeURIComponent(newUserEmail)}`); - const referredByResponseJson = await referredByResponse.json() as any - expect(referredByResponseJson).toHaveProperty('refcode') - - // create a second referral - const secondNewUserEmail = 'secondnewuser@example.com' - await SELF.fetch('http://example.com/referrals/create', - { - method: 'POST', - body: (() => { - const form = new FormData() - form.append('refcode', refcode) - form.append('email', secondNewUserEmail) - return form - })() - } - ); - - // now there should be two referrals - referralsResponse = await SELF.fetch(`http://example.com/referrals/${encodeURIComponent(refcode)}`); - referralsResponseJson = await referralsResponse.json() as any - expect(referralsResponseJson).toHaveProperty('referrals'); - expect(referralsResponseJson.referrals).toBeInstanceOf(Array); - expect(referralsResponseJson.referrals).toHaveLength(2) - - const secondReferredByResponse = await SELF.fetch(`http://example.com/referredby/${encodeURIComponent(secondNewUserEmail)}`); - const secondReferredByResponseJson = await secondReferredByResponse.json() as any - expect(secondReferredByResponseJson).toHaveProperty('refcode') - }); - - it('will not create a referral for the user who created the refcode', async () => { - - // create a refcode - const email = 'test@example.com' - const form = new FormData() - form.append('email', email) - const createRefcodeResponse = await SELF.fetch('http://example.com/refcode/create', - { - method: 'POST', - body: (() => { - const form = new FormData() - form.append('email', email) - return form - })() - } - ) - const refcode = (await createRefcodeResponse.json() as any).refcode as string - - const response = await SELF.fetch('http://example.com/referrals/create', - { - method: 'POST', - body: (() => { - const form = new FormData() - form.append('refcode', refcode) - form.append('email', email) - return form - })() - } - ) - expect(response.status).toBe(400) - }) -}); - -// TODO: this -function useDummyStripeEnvironmentConstants () { - const referrerEmail = 'referrer@example.con' - const referralEmail = 'referral@example.com' - return { referrerEmail, referralEmail } -} - -async function createDummyStripeEnvironment (stripe: Stripe) { - const { referralEmail, referrerEmail } = useDummyStripeEnvironmentConstants() - const referralStripeCustomer = await stripe.customers.create({ email: referralEmail }) - const referrerStripeCustomer = await stripe.customers.create({ email: referrerEmail }) - return ({ - referralEmail, referrerEmail, referralStripeCustomer, referrerStripeCustomer - }) -} - -async function cleanupDummyStripeEnvironment (stripe: Stripe) { - const { referrerEmail, referralEmail } = useDummyStripeEnvironmentConstants() - for (const email of [referralEmail, referrerEmail]) { - const result = await stripe.customers.search({ query: `email:"${email}"` }) - for (const customer of result.data) { - await stripe.customers.del(customer.id) - } - } -} - -async function resetDummyStripeEnvironment (stripe: Stripe) { - await cleanupDummyStripeEnvironment(stripe) - await createDummyStripeEnvironment(stripe) -} - - -// TODO: Work in Progress -// I'm trying to use Stripe sandboxes to create a static remote environment reliable enough for testing -// the credits and conversions reconciliation logic but haven't finished yet - TBD after we get v1 out the door -describe.skip('conversion and credit cronjob', () => { - it('checks stripe', async () => { - const stripe = new Stripe(env.STRIPE_API_KEY) - // uncomment this to reset the stripe environment - // await resetDummyStripeEnvironment(stripe) - const { referralEmail, referrerEmail } = useDummyStripeEnvironmentConstants() - const refcode = await createRefcode(env.REFERRALS, referrerEmail) - await createReferral(env.REFERRALS, referralEmail, refcode) - await stripe.customers.search({ query: `email:"${referralEmail}"` }) - //const stripeCustomer = await stripe.customers.create({email: referralEmail}) - - await calculateConversionsAndCredits({} as ScheduledController, env, createExecutionContext()) - - }) - -}) \ No newline at end of file From 55697ae348bbe88201ab51a9e74954dd9e8c6d5a Mon Sep 17 00:00:00 2001 From: Travis Vachon Date: Thu, 19 Dec 2024 15:26:42 -0800 Subject: [PATCH 2/2] fix: remove unneeded comment --- test/cron.spec.ts | 1 - test/http.spec.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/test/cron.spec.ts b/test/cron.spec.ts index 7b8b202..3bed4ab 100644 --- a/test/cron.spec.ts +++ b/test/cron.spec.ts @@ -1,4 +1,3 @@ -// test/index.spec.ts import { env, createExecutionContext, SELF } from 'cloudflare:test'; import { describe, it, expect, beforeAll } from 'vitest'; import { calculateConversionsAndCredits } from '../src/index'; diff --git a/test/http.spec.ts b/test/http.spec.ts index 6719248..9f7f0a6 100644 --- a/test/http.spec.ts +++ b/test/http.spec.ts @@ -1,4 +1,3 @@ -// test/index.spec.ts import { SELF } from 'cloudflare:test'; import { describe, it, expect } from 'vitest';