import { it, beforeEach, describe, expect } from 'vitest';
import { provideSdkInstance, Realtime } from "../AblyReactHooks";
import { useChannel } from "./useChannel";
import { useState } from "react";
import { render, screen } from '@testing-library/react';
import { FakeAblySdk, FakeAblyChannels } from "../fakes/ably";
import { Types } from 'ably';
import { act } from 'react-dom/test-utils';
describe("useChannel", () => {
let channels: FakeAblyChannels;
let ablyClient: FakeAblySdk;
let otherClient: FakeAblySdk;
beforeEach(() => {
channels = new FakeAblyChannels(["blah"]);
ablyClient = new FakeAblySdk().connectTo(channels);
otherClient = new FakeAblySdk().connectTo(channels);
provideSdkInstance(ablyClient as any);
});
it("component can useChannel and renders nothing by default", async () => {
render();
const messageUl = screen.getAllByRole("messages")[0];
expect(messageUl.childElementCount).toBe(0);
});
it("component updates when message arrives", async () => {
render();
await act(async () => {
otherClient.channels.get("blah").publish({ text: "message text" });
});
const messageUl = screen.getAllByRole("messages")[0];
expect(messageUl.childElementCount).toBe(1);
expect(messageUl.children[0].innerHTML).toBe("message text");
});
it("component updates when multiple messages arrive", async () => {
render();
await act(async () => {
otherClient.channels.get("blah").publish({ text: "message text1" });
otherClient.channels.get("blah").publish({ text: "message text2" });
});
const messageUl = screen.getAllByRole("messages")[0];
expect(messageUl.children[0].innerHTML).toBe("message text1");
expect(messageUl.children[1].innerHTML).toBe("message text2");
});
it("useChannel works with multiple clients", async () => {
render();
await act(async () => {
ablyClient.channels.get("blah").publish({ text: "message text1" });
otherClient.channels.get("bleh").publish({ text: "message text2" });
});
const messageUl = screen.getAllByRole("messages")[0];
expect(messageUl.children[0].innerHTML).toBe("message text1");
expect(messageUl.children[1].innerHTML).toBe("message text2");
});
});
const UseChannelComponentMultipleClients = ({client1, client2}) => {
const [messages, updateMessages] = useState([]);
const [channel1] = useChannel({channelName: "blah", realtime: client1}, (message) => {
updateMessages((prev) => [...prev, message]);
});
const [channel2] = useChannel({channelName: "bleh", realtime: client2}, (message) => {
updateMessages((prev) => [...prev, message]);
});
const messagePreviews = messages.map((msg, index) => {msg.data.text});
return ();
}
const UseChannelComponent = () => {
const [messages, updateMessages] = useState([]);
const [channel, ably] = useChannel("blah", (message) => {
updateMessages((prev) => [...prev, message]);
});
const messagePreviews = messages.map((msg, index) => {msg.data.text});
return ();
}