File size: 2,746 Bytes
2f49513
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import { renderHook, act } from "@testing-library/react";
import useACEController from "../useACEController";
import WS from "jest-websocket-mock";
import pcmToWav from "../../utils/pcmToWav";
import extractWavSampleRate from "../../utils/extractWavSampleRate";

describe("useACEController", () => {
  let server: WS;
  const url = "ws://localhost:1234";

  beforeEach(() => {
    server = new WS(url);
  });

  afterEach(() => {
    WS.clean();
  });

  test("connects to WebSocket server", async () => {
    const onError = jest.fn();
    const { result } = renderHook(() =>
      useACEController({
        url,
        onError,
        onAudioChunk: jest.fn(),
        onTTS: jest.fn(),
        onASR: jest.fn(),
      })
    );

    act(() => {
      result.current.connect();
    });

    await server.connected;
    expect(result.current.connectionStatus).toBe("connected");
  });

  test("handles audio chunks", async () => {
    const onAudioChunk = jest.fn();
    const { result } = renderHook(() =>
      useACEController({
        url,
        onError: jest.fn(),
        onAudioChunk,
        onTTS: jest.fn(),
        onASR: jest.fn(),
      })
    );

    // Connect to the WebSocket server first
    act(() => {
      result.current.connect();
    });

    await server.connected;

    // Create sample audio data
    const audioData = new Int16Array([1, 2, 3]);
    const wavBuffer = pcmToWav(audioData.buffer, 16_000);

    server.send(wavBuffer);

    // Wait for async operations to complete
    await act(async () => {
      await new Promise((resolve) => setTimeout(resolve, 0));
    });

    expect(onAudioChunk).toHaveBeenCalled();
  });

  test("sends audio chunk as WAV through WebSocket", async () => {
    const { result } = renderHook(() =>
      useACEController({
        url,
        onError: jest.fn(),
        onAudioChunk: jest.fn(),
        onTTS: jest.fn(),
        onASR: jest.fn(),
      })
    );

    // Connect to the WebSocket server first
    act(() => {
      result.current.connect();
    });

    await server.connected;

    // Create sample audio data and parameters
    const sampleRate = 16000;
    const numChannels = 1;
    const audioData = new Int16Array([1, 2, 3, 4, 5]);

    // Send the audio chunk
    act(() => {
      result.current.sendAudioChunk(audioData.buffer, sampleRate, numChannels);
    });

    // Wait for the message to be sent to the server
    const receivedData = (await server.nextMessage) as ArrayBuffer;

    // Verify the received data is a valid WAV file with the expected sample rate
    expect(receivedData).toBeInstanceOf(ArrayBuffer);
    const detectedSampleRate = extractWavSampleRate(receivedData);
    expect(detectedSampleRate).toBe(sampleRate);
  });
});