Skip to content

Commit 6019d46

Browse files
authored
chore(supabase): update supabase realtime integration tests to test on vsn=2.0.0 (#1925)
1 parent e71b0da commit 6019d46

File tree

11 files changed

+483
-181
lines changed

11 files changed

+483
-181
lines changed

packages/core/supabase-js/test/deno/integration.test.ts

Lines changed: 53 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@ Deno.test(
1616
const ANON_KEY =
1717
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0'
1818

19-
const supabase = createClient(SUPABASE_URL, ANON_KEY, {
20-
realtime: { heartbeatIntervalMs: 500 },
21-
})
19+
const supabase = createClient(SUPABASE_URL, ANON_KEY)
2220

2321
// Cleanup function to be called after all tests
2422
const cleanup = async () => {
@@ -147,56 +145,61 @@ Deno.test(
147145
assertEquals(data.user, null)
148146
})
149147

150-
await t.step('Realtime - is able to connect and broadcast', async () => {
151-
const channelName = `channel-${crypto.randomUUID()}`
152-
let channel: RealtimeChannel
153-
const email = `test-${Date.now()}@example.com`
154-
const password = 'password123'
155-
156-
// Sign up and create channel
157-
await supabase.auth.signUp({ email, password })
158-
const config = { broadcast: { self: true }, private: true }
159-
channel = supabase.channel(channelName, { config })
160-
161-
const testMessage = { message: 'test' }
162-
let receivedMessage: any
163-
let subscribed = false
164-
let attempts = 0
165-
166-
channel
167-
.on('broadcast', { event: '*' }, (payload: unknown) => (receivedMessage = payload))
168-
.subscribe((status: string) => {
169-
if (status == 'SUBSCRIBED') subscribed = true
148+
// Run realtime tests for both versions
149+
const versions = ['1.0.0', '2.0.0']
150+
for (const vsn of versions) {
151+
await t.step(`Realtime v${vsn} - is able to connect and broadcast`, async () => {
152+
const supabaseRealtime = createClient(SUPABASE_URL, ANON_KEY, {
153+
realtime: { heartbeatIntervalMs: 500, vsn },
170154
})
171155

172-
// Wait for subscription
173-
while (!subscribed) {
174-
if (attempts > 50) throw new Error('Timeout waiting for subscription')
175-
await new Promise((resolve) => setTimeout(resolve, 100))
176-
attempts++
177-
}
178-
179-
attempts = 0
180-
181-
channel.send({
182-
type: 'broadcast',
183-
event: 'test-event',
184-
payload: testMessage,
156+
const channelName = `channel-${crypto.randomUUID()}`
157+
let channel: RealtimeChannel
158+
const email = `test-${Date.now()}@example.com`
159+
const password = 'password123'
160+
161+
// Sign up and create channel
162+
await supabaseRealtime.auth.signUp({ email, password })
163+
const config = { broadcast: { self: true, ack: true }, private: true }
164+
channel = supabaseRealtime.channel(channelName, { config })
165+
166+
const testMessage = { message: 'test' }
167+
let receivedMessage: any
168+
let subscribed = false
169+
let attempts = 0
170+
171+
channel
172+
.on('broadcast', { event: 'test-event' }, (payload: unknown) => (receivedMessage = payload))
173+
.subscribe((status: string) => {
174+
if (status == 'SUBSCRIBED') subscribed = true
175+
})
176+
177+
// Wait for subscription
178+
while (!subscribed) {
179+
if (attempts > 50) throw new Error('Timeout waiting for subscription')
180+
await new Promise((resolve) => setTimeout(resolve, 100))
181+
attempts++
182+
}
183+
184+
attempts = 0
185+
186+
await channel.send({ type: 'broadcast', event: 'test-event', payload: testMessage })
187+
188+
// Wait on message
189+
while (!receivedMessage) {
190+
if (attempts > 50) throw new Error('Timeout waiting for message')
191+
await new Promise((resolve) => setTimeout(resolve, 100))
192+
attempts++
193+
}
194+
195+
assertExists(receivedMessage)
196+
assertEquals(supabaseRealtime.realtime.getChannels().length, 1)
197+
198+
// Cleanup channel
199+
await channel.unsubscribe()
200+
await supabaseRealtime.removeAllChannels()
185201
})
186-
187-
// Wait on message
188-
while (!receivedMessage) {
189-
if (attempts > 50) throw new Error('Timeout waiting for message')
190-
await new Promise((resolve) => setTimeout(resolve, 100))
191-
attempts++
192-
}
193-
194-
assertExists(receivedMessage)
195-
assertEquals(supabase.realtime.getChannels().length, 1)
196-
197-
// Cleanup channel
198-
await channel.unsubscribe()
199-
})
202+
}
200203

201204
await t.step('Storage - should upload and list file in bucket', async () => {
202205
const bucket = 'test-bucket'

packages/core/supabase-js/test/integration.browser.test.ts

Lines changed: 97 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@ import { assertEquals } from 'https://deno.land/[email protected]/testing/asserts.ts'
33
import { describe, it, beforeAll, afterAll } from 'https://deno.land/[email protected]/testing/bdd.ts'
44
import { Browser, Page, launch } from 'npm:[email protected]'
55
import { sleep } from 'https://deno.land/x/sleep/mod.ts'
6-
// Run the UMD build before serving the page
6+
77
const stderr = 'inherit'
88
const ac = new AbortController()
99

1010
let browser: Browser
11-
let page: Page
1211

1312
const port = 8000
1413
const content = `<html>
@@ -22,23 +21,68 @@ const content = `<html>
2221
<script type="text/babel" data-presets="env,react">
2322
const SUPABASE_URL = 'http://127.0.0.1:54321'
2423
const ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0'
25-
const supabase = supabase.createClient(SUPABASE_URL, ANON_KEY)
26-
const App = (props) => {
24+
25+
// Get vsn from query params
26+
const urlParams = new URLSearchParams(window.location.search)
27+
const vsn = urlParams.get('vsn') || '1.0.0'
28+
29+
const supabase = window.supabase.createClient(SUPABASE_URL, ANON_KEY, {
30+
realtime: {
31+
heartbeatIntervalMs: 500,
32+
vsn: vsn
33+
}
34+
})
35+
36+
const App = () => {
2737
const [realtimeStatus, setRealtimeStatus] = React.useState(null)
28-
const channel = supabase.channel('realtime:public:todos')
38+
const [receivedMessage, setReceivedMessage] = React.useState(null)
39+
const channelRef = React.useRef(null)
40+
2941
React.useEffect(() => {
30-
channel.subscribe((status) => { if (status === 'SUBSCRIBED') setRealtimeStatus(status) })
42+
const channelName = \`test-broadcast-channel-\${vsn}\`
43+
const channel = supabase.channel(channelName, {
44+
config: { broadcast: { ack: true, self: true } }
45+
})
46+
47+
channelRef.current = channel
48+
49+
// Listen for broadcast messages
50+
channel.on('broadcast', { event: 'test-event' }, (payload) => {
51+
setReceivedMessage(payload.payload)
52+
})
53+
54+
// Subscribe to the channel
55+
channel.subscribe(async (status) => {
56+
if (status === 'SUBSCRIBED') {
57+
setRealtimeStatus(status)
58+
59+
// Send a test message after subscribing
60+
await channel.send({
61+
type: 'broadcast',
62+
event: 'test-event',
63+
payload: { message: 'Hello from browser!' }
64+
})
65+
}
66+
})
3167
3268
return () => {
3369
channel.unsubscribe()
3470
}
3571
}, [])
36-
if (realtimeStatus) {
37-
return <div id='realtime_status'>{realtimeStatus}</div>
38-
} else {
39-
return <div></div>
40-
}
72+
73+
return (
74+
<div>
75+
<div id='vsn'>{vsn}</div>
76+
{realtimeStatus && (
77+
<div id='realtime_status'>{realtimeStatus}</div>
78+
)}
79+
{receivedMessage && (
80+
<div id='received_message'>{receivedMessage.message}</div>
81+
)}
82+
</div>
83+
)
4184
}
85+
4286
ReactDOM.render(<App />, document.getElementById('output'));
4387
</script>
4488
</body>
@@ -80,8 +124,6 @@ beforeAll(async () => {
80124

81125
afterAll(async () => {
82126
await ac.abort()
83-
await page.close()
84-
await browser.close()
85127
await sleep(1)
86128
})
87129

@@ -90,13 +132,49 @@ describe('Realtime integration test', () => {
90132
browser = await launch({
91133
args: ['--no-sandbox', '--disable-setuid-sandbox'],
92134
})
93-
page = await browser.newPage()
94135
})
95136

96-
it('connects to realtime', async () => {
97-
await page.goto('http://localhost:8000')
98-
await page.waitForSelector('#realtime_status', { timeout: 2000 })
99-
const realtimeStatus = await page.$eval('#realtime_status', (el) => el.innerHTML)
100-
assertEquals(realtimeStatus, 'SUBSCRIBED')
137+
afterAll(async () => {
138+
await browser.close()
139+
})
140+
141+
const versions = [{ vsn: '1.0.0' }, { vsn: '2.0.0' }]
142+
143+
versions.forEach(({ vsn }) => {
144+
describe(`Realtime with vsn: ${vsn}`, () => {
145+
let page: Page
146+
147+
beforeAll(async () => {
148+
page = await browser.newPage()
149+
})
150+
151+
afterAll(async () => {
152+
await page.close()
153+
})
154+
155+
it('connects to realtime', async () => {
156+
await page.goto(`http://localhost:${port}?vsn=${vsn}`)
157+
await page.waitForSelector('#realtime_status', { timeout: 2000 })
158+
const realtimeStatus = await page.$eval('#realtime_status', (el) => el.innerHTML)
159+
assertEquals(realtimeStatus, 'SUBSCRIBED')
160+
161+
// Verify correct version is being used
162+
const displayedVsn = await page.$eval('#vsn', (el) => el.innerHTML)
163+
assertEquals(displayedVsn, vsn)
164+
})
165+
166+
it('can broadcast and receive messages', async () => {
167+
await page.goto(`http://localhost:${port}?vsn=${vsn}`)
168+
169+
// Wait for subscription
170+
await page.waitForSelector('#realtime_status', { timeout: 2000 })
171+
172+
// Wait for the broadcast message to be received
173+
await page.waitForSelector('#received_message', { timeout: 5000 })
174+
const receivedMessage = await page.$eval('#received_message', (el) => el.innerHTML)
175+
176+
assertEquals(receivedMessage, 'Hello from browser!')
177+
})
178+
})
101179
})
102180
})

packages/core/supabase-js/test/integration.test.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -265,19 +265,29 @@ describe('Supabase Integration Tests', () => {
265265
})
266266
})
267267

268-
describe('Realtime', () => {
268+
describe.each([{ vsn: '1.0.0' }, { vsn: '2.0.0' }])('Realtime with vsn: $vsn', ({ vsn }) => {
269269
const channelName = `channel-${crypto.randomUUID()}`
270270
let channel: RealtimeChannel
271271
let email: string
272272
let password: string
273+
let supabase: SupabaseClient
273274

274275
beforeEach(async () => {
276+
// Create client with specific version
277+
supabase = createClient(SUPABASE_URL, ANON_KEY, {
278+
realtime: {
279+
heartbeatIntervalMs: 500,
280+
vsn,
281+
...(wsTransport && { transport: wsTransport }),
282+
},
283+
})
284+
275285
await supabase.auth.signOut()
276286
email = `test-${Date.now()}@example.com`
277287
password = 'password123'
278288
await supabase.auth.signUp({ email, password })
279289

280-
const config = { broadcast: { self: true }, private: true }
290+
const config = { broadcast: { ack: true, self: true }, private: true }
281291
channel = supabase.channel(channelName, { config })
282292
})
283293

@@ -292,8 +302,8 @@ describe('Supabase Integration Tests', () => {
292302
let attempts = 0
293303

294304
channel
295-
.on('broadcast', { event: '*' }, (payload) => (receivedMessage = payload))
296-
.subscribe((status, err) => {
305+
.on('broadcast', { event: 'test-event' }, (payload) => (receivedMessage = payload))
306+
.subscribe((status) => {
297307
if (status == 'SUBSCRIBED') subscribed = true
298308
})
299309

@@ -306,7 +316,7 @@ describe('Supabase Integration Tests', () => {
306316

307317
attempts = 0
308318

309-
channel.send({ type: 'broadcast', event: 'test-event', payload: testMessage })
319+
await channel.send({ type: 'broadcast', event: 'test-event', payload: testMessage })
310320

311321
// Wait on message
312322
while (!receivedMessage) {

0 commit comments

Comments
 (0)