@tambo-ai/react 0.38.1 → 0.40.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/hooks/use-component-state.js +0 -1
- package/dist/hooks/use-component-state.js.map +1 -1
- package/dist/hooks/use-thread-input.d.ts +1 -0
- package/dist/hooks/use-thread-input.d.ts.map +1 -1
- package/dist/hooks/use-thread-input.js +2 -1
- package/dist/hooks/use-thread-input.js.map +1 -1
- package/dist/mcp/mcp-client.d.ts +15 -15
- package/dist/providers/__tests__/tambo-prop-stream-provider.test.js +144 -224
- package/dist/providers/__tests__/tambo-prop-stream-provider.test.js.map +1 -1
- package/dist/providers/__tests__/tambo-thread-provider.test.js +65 -0
- package/dist/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
- package/dist/providers/index.d.ts +2 -2
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +4 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/tambo-prop-stream-provider/index.d.ts +19 -0
- package/dist/providers/tambo-prop-stream-provider/index.d.ts.map +1 -0
- package/dist/providers/tambo-prop-stream-provider/index.js +43 -0
- package/dist/providers/tambo-prop-stream-provider/index.js.map +1 -0
- package/dist/providers/tambo-prop-stream-provider/pending.d.ts +12 -0
- package/dist/providers/tambo-prop-stream-provider/pending.d.ts.map +1 -0
- package/dist/providers/tambo-prop-stream-provider/pending.js +31 -0
- package/dist/providers/tambo-prop-stream-provider/pending.js.map +1 -0
- package/dist/providers/tambo-prop-stream-provider/provider.d.ts +17 -0
- package/dist/providers/tambo-prop-stream-provider/provider.d.ts.map +1 -0
- package/dist/providers/tambo-prop-stream-provider/provider.js +107 -0
- package/dist/providers/tambo-prop-stream-provider/provider.js.map +1 -0
- package/dist/providers/tambo-prop-stream-provider/streaming.d.ts +12 -0
- package/dist/providers/tambo-prop-stream-provider/streaming.d.ts.map +1 -0
- package/dist/providers/tambo-prop-stream-provider/streaming.js +28 -0
- package/dist/providers/tambo-prop-stream-provider/streaming.js.map +1 -0
- package/dist/providers/tambo-prop-stream-provider/success.d.ts +12 -0
- package/dist/providers/tambo-prop-stream-provider/success.d.ts.map +1 -0
- package/dist/providers/tambo-prop-stream-provider/success.js +28 -0
- package/dist/providers/tambo-prop-stream-provider/success.js.map +1 -0
- package/dist/providers/tambo-prop-stream-provider/types.d.ts +25 -0
- package/dist/providers/tambo-prop-stream-provider/types.d.ts.map +1 -0
- package/dist/providers/tambo-prop-stream-provider/types.js +6 -0
- package/dist/providers/tambo-prop-stream-provider/types.js.map +1 -0
- package/dist/providers/tambo-thread-provider.d.ts +1 -0
- package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-provider.js +13 -2
- package/dist/providers/tambo-thread-provider.js.map +1 -1
- package/dist/util/registry.d.ts +4 -1
- package/dist/util/registry.d.ts.map +1 -1
- package/dist/util/registry.js +9 -11
- package/dist/util/registry.js.map +1 -1
- package/esm/hooks/use-component-state.js +0 -1
- package/esm/hooks/use-component-state.js.map +1 -1
- package/esm/hooks/use-thread-input.d.ts +1 -0
- package/esm/hooks/use-thread-input.d.ts.map +1 -1
- package/esm/hooks/use-thread-input.js +2 -1
- package/esm/hooks/use-thread-input.js.map +1 -1
- package/esm/mcp/mcp-client.d.ts +15 -15
- package/esm/providers/__tests__/tambo-prop-stream-provider.test.js +144 -224
- package/esm/providers/__tests__/tambo-prop-stream-provider.test.js.map +1 -1
- package/esm/providers/__tests__/tambo-thread-provider.test.js +65 -0
- package/esm/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
- package/esm/providers/index.d.ts +2 -2
- package/esm/providers/index.d.ts.map +1 -1
- package/esm/providers/index.js +1 -1
- package/esm/providers/index.js.map +1 -1
- package/esm/providers/tambo-prop-stream-provider/index.d.ts +19 -0
- package/esm/providers/tambo-prop-stream-provider/index.d.ts.map +1 -0
- package/esm/providers/tambo-prop-stream-provider/index.js +22 -0
- package/esm/providers/tambo-prop-stream-provider/index.js.map +1 -0
- package/esm/providers/tambo-prop-stream-provider/pending.d.ts +12 -0
- package/esm/providers/tambo-prop-stream-provider/pending.d.ts.map +1 -0
- package/esm/providers/tambo-prop-stream-provider/pending.js +24 -0
- package/esm/providers/tambo-prop-stream-provider/pending.js.map +1 -0
- package/esm/providers/tambo-prop-stream-provider/provider.d.ts +17 -0
- package/esm/providers/tambo-prop-stream-provider/provider.d.ts.map +1 -0
- package/esm/providers/tambo-prop-stream-provider/provider.js +70 -0
- package/esm/providers/tambo-prop-stream-provider/provider.js.map +1 -0
- package/esm/providers/tambo-prop-stream-provider/streaming.d.ts +12 -0
- package/esm/providers/tambo-prop-stream-provider/streaming.d.ts.map +1 -0
- package/esm/providers/tambo-prop-stream-provider/streaming.js +21 -0
- package/esm/providers/tambo-prop-stream-provider/streaming.js.map +1 -0
- package/esm/providers/tambo-prop-stream-provider/success.d.ts +12 -0
- package/esm/providers/tambo-prop-stream-provider/success.d.ts.map +1 -0
- package/esm/providers/tambo-prop-stream-provider/success.js +21 -0
- package/esm/providers/tambo-prop-stream-provider/success.js.map +1 -0
- package/esm/providers/tambo-prop-stream-provider/types.d.ts +25 -0
- package/esm/providers/tambo-prop-stream-provider/types.d.ts.map +1 -0
- package/esm/providers/tambo-prop-stream-provider/types.js +3 -0
- package/esm/providers/tambo-prop-stream-provider/types.js.map +1 -0
- package/esm/providers/tambo-thread-provider.d.ts +1 -0
- package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-provider.js +14 -3
- package/esm/providers/tambo-thread-provider.js.map +1 -1
- package/esm/util/registry.d.ts +4 -1
- package/esm/util/registry.d.ts.map +1 -1
- package/esm/util/registry.js +7 -9
- package/esm/util/registry.js.map +1 -1
- package/package.json +12 -11
- package/dist/providers/tambo-prop-stream-provider.d.ts +0 -96
- package/dist/providers/tambo-prop-stream-provider.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider.js +0 -185
- package/dist/providers/tambo-prop-stream-provider.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider.d.ts +0 -96
- package/esm/providers/tambo-prop-stream-provider.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider.js +0 -148
- package/esm/providers/tambo-prop-stream-provider.js.map +0 -1
|
@@ -5,17 +5,63 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const react_1 = require("@testing-library/react");
|
|
7
7
|
const react_2 = __importDefault(require("react"));
|
|
8
|
+
const use_current_message_1 = require("../../hooks/use-current-message");
|
|
9
|
+
const generate_component_response_1 = require("../../model/generate-component-response");
|
|
10
|
+
const tambo_thread_provider_1 = require("../../providers/tambo-thread-provider");
|
|
8
11
|
const tambo_prop_stream_provider_1 = require("../tambo-prop-stream-provider");
|
|
12
|
+
// Mock the required providers
|
|
13
|
+
jest.mock("../../providers/tambo-thread-provider", () => ({
|
|
14
|
+
useTamboThread: jest.fn(),
|
|
15
|
+
}));
|
|
16
|
+
jest.mock("../../hooks/use-current-message", () => ({
|
|
17
|
+
useTamboCurrentMessage: jest.fn(),
|
|
18
|
+
}));
|
|
19
|
+
// Mock window for SSR tests
|
|
20
|
+
const originalWindow = global.window;
|
|
21
|
+
// Helper function to create mock ComponentDecisionV2
|
|
22
|
+
const createMockComponent = (props = {}) => ({
|
|
23
|
+
componentName: "TestComponent",
|
|
24
|
+
componentState: {},
|
|
25
|
+
message: "Component generated",
|
|
26
|
+
props,
|
|
27
|
+
reasoning: "Test reasoning",
|
|
28
|
+
});
|
|
29
|
+
// Helper function to create mock TamboThreadMessage
|
|
30
|
+
const createMockMessage = (overrides = {}) => ({
|
|
31
|
+
id: "test-message",
|
|
32
|
+
componentState: {},
|
|
33
|
+
content: [{ type: "text", text: "test content" }],
|
|
34
|
+
createdAt: new Date().toISOString(),
|
|
35
|
+
role: "assistant",
|
|
36
|
+
threadId: "test-thread",
|
|
37
|
+
...overrides,
|
|
38
|
+
});
|
|
9
39
|
// Helper component to test hook usage
|
|
10
40
|
const TestHookComponent = ({ testKey = "default", }) => {
|
|
11
|
-
const {
|
|
41
|
+
const { streamStatus, getStatusForKey } = (0, tambo_prop_stream_provider_1.useTamboStream)();
|
|
12
42
|
const status = getStatusForKey(testKey);
|
|
13
43
|
return (react_2.default.createElement("div", null,
|
|
14
|
-
react_2.default.createElement("div", { "data-testid": "data" }, JSON.stringify(data)),
|
|
15
44
|
react_2.default.createElement("div", { "data-testid": "stream-status" }, JSON.stringify(streamStatus)),
|
|
16
45
|
react_2.default.createElement("div", { "data-testid": "key-status" }, JSON.stringify(status))));
|
|
17
46
|
};
|
|
18
47
|
describe("TamboPropStreamProvider", () => {
|
|
48
|
+
beforeEach(() => {
|
|
49
|
+
// Restore window for client-side tests
|
|
50
|
+
global.window = originalWindow;
|
|
51
|
+
// Default mock implementations
|
|
52
|
+
jest.mocked(tambo_thread_provider_1.useTamboThread).mockReturnValue({
|
|
53
|
+
generationStage: generate_component_response_1.GenerationStage.IDLE,
|
|
54
|
+
});
|
|
55
|
+
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue({
|
|
56
|
+
id: "test-message",
|
|
57
|
+
component: {
|
|
58
|
+
props: {},
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
afterEach(() => {
|
|
63
|
+
jest.clearAllMocks();
|
|
64
|
+
});
|
|
19
65
|
describe("Hook Error Handling", () => {
|
|
20
66
|
it("should throw error when useTamboStream is used outside provider", () => {
|
|
21
67
|
// Suppress console.error for this test
|
|
@@ -27,250 +73,124 @@ describe("TamboPropStreamProvider", () => {
|
|
|
27
73
|
console.error = originalError;
|
|
28
74
|
});
|
|
29
75
|
});
|
|
30
|
-
describe("Basic Functionality", () => {
|
|
31
|
-
it("should provide data and stream status through context", () => {
|
|
32
|
-
const testData = { message: "Hello World" };
|
|
33
|
-
const testStreamStatus = {
|
|
34
|
-
isPending: false,
|
|
35
|
-
isStreaming: false,
|
|
36
|
-
isSuccess: true,
|
|
37
|
-
isError: false,
|
|
38
|
-
streamError: undefined,
|
|
39
|
-
};
|
|
40
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, { data: testData, streamStatus: testStreamStatus },
|
|
41
|
-
react_2.default.createElement(TestHookComponent, null)));
|
|
42
|
-
expect(react_1.screen.getByTestId("data")).toHaveTextContent(JSON.stringify(testData));
|
|
43
|
-
expect(react_1.screen.getByTestId("stream-status")).toHaveTextContent(JSON.stringify(testStreamStatus));
|
|
44
|
-
});
|
|
45
|
-
it("should use default stream status when none provided", () => {
|
|
46
|
-
const testData = { message: "Hello World" };
|
|
47
|
-
const expectedDefaultStatus = {
|
|
48
|
-
isPending: false,
|
|
49
|
-
isStreaming: false,
|
|
50
|
-
isSuccess: true,
|
|
51
|
-
isError: false,
|
|
52
|
-
streamError: undefined,
|
|
53
|
-
};
|
|
54
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, { data: testData },
|
|
55
|
-
react_2.default.createElement(TestHookComponent, null)));
|
|
56
|
-
expect(react_1.screen.getByTestId("stream-status")).toHaveTextContent(JSON.stringify(expectedDefaultStatus));
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
76
|
describe("Compound Components", () => {
|
|
60
|
-
describe("
|
|
61
|
-
it("should render
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
};
|
|
68
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider,
|
|
69
|
-
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.
|
|
77
|
+
describe("Streaming Component", () => {
|
|
78
|
+
it("should render streaming when isPending is true", () => {
|
|
79
|
+
jest.mocked(tambo_thread_provider_1.useTamboThread).mockReturnValue({
|
|
80
|
+
generationStage: generate_component_response_1.GenerationStage.IDLE,
|
|
81
|
+
});
|
|
82
|
+
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(createMockMessage({
|
|
83
|
+
component: createMockComponent({ title: "" }),
|
|
84
|
+
}));
|
|
85
|
+
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, null,
|
|
86
|
+
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Streaming, null,
|
|
70
87
|
react_2.default.createElement("div", { "data-testid": "loading" }, "Loading..."))));
|
|
71
88
|
expect(react_1.screen.getByTestId("loading")).toBeInTheDocument();
|
|
72
89
|
});
|
|
73
|
-
it("should render
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
};
|
|
80
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider,
|
|
81
|
-
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.
|
|
90
|
+
it("should render streaming when isStreaming is true", () => {
|
|
91
|
+
jest.mocked(tambo_thread_provider_1.useTamboThread).mockReturnValue({
|
|
92
|
+
generationStage: generate_component_response_1.GenerationStage.STREAMING_RESPONSE,
|
|
93
|
+
});
|
|
94
|
+
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(createMockMessage({
|
|
95
|
+
component: createMockComponent({ title: "Partial" }),
|
|
96
|
+
}));
|
|
97
|
+
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, null,
|
|
98
|
+
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Streaming, null,
|
|
82
99
|
react_2.default.createElement("div", { "data-testid": "loading" }, "Loading..."))));
|
|
83
100
|
expect(react_1.screen.getByTestId("loading")).toBeInTheDocument();
|
|
84
101
|
});
|
|
85
|
-
it("should not render loading when not pending or streaming", () => {
|
|
86
|
-
const streamStatus = {
|
|
87
|
-
isPending: false,
|
|
88
|
-
isStreaming: false,
|
|
89
|
-
isSuccess: true,
|
|
90
|
-
isError: false,
|
|
91
|
-
};
|
|
92
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, { data: "test", streamStatus: streamStatus },
|
|
93
|
-
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Loading, null,
|
|
94
|
-
react_2.default.createElement("div", { "data-testid": "loading" }, "Loading..."))));
|
|
95
|
-
expect(react_1.screen.queryByTestId("loading")).not.toBeInTheDocument();
|
|
96
|
-
});
|
|
97
102
|
});
|
|
98
|
-
describe("
|
|
99
|
-
it("should render
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
};
|
|
106
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider,
|
|
107
|
-
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.
|
|
108
|
-
react_2.default.createElement("div", { "data-testid": "complete" }, "Complete!"))));
|
|
109
|
-
expect(react_1.screen.getByTestId("complete")).toBeInTheDocument();
|
|
110
|
-
});
|
|
111
|
-
it("should not render complete when data is null", () => {
|
|
112
|
-
const streamStatus = {
|
|
113
|
-
isPending: false,
|
|
114
|
-
isStreaming: false,
|
|
115
|
-
isSuccess: true,
|
|
116
|
-
isError: false,
|
|
117
|
-
};
|
|
118
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, { data: null, streamStatus: streamStatus },
|
|
119
|
-
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Complete, null,
|
|
120
|
-
react_2.default.createElement("div", { "data-testid": "complete" }, "Complete!"))));
|
|
121
|
-
expect(react_1.screen.queryByTestId("complete")).not.toBeInTheDocument();
|
|
122
|
-
});
|
|
123
|
-
it("should not render complete when data is undefined", () => {
|
|
124
|
-
const streamStatus = {
|
|
125
|
-
isPending: false,
|
|
126
|
-
isStreaming: false,
|
|
127
|
-
isSuccess: true,
|
|
128
|
-
isError: false,
|
|
129
|
-
};
|
|
130
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, { data: undefined, streamStatus: streamStatus },
|
|
131
|
-
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Complete, null,
|
|
103
|
+
describe("Success Component", () => {
|
|
104
|
+
it("should not render success when isSuccess is false", () => {
|
|
105
|
+
jest.mocked(tambo_thread_provider_1.useTamboThread).mockReturnValue({
|
|
106
|
+
generationStage: generate_component_response_1.GenerationStage.IDLE,
|
|
107
|
+
});
|
|
108
|
+
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(createMockMessage({
|
|
109
|
+
component: createMockComponent({ title: "" }),
|
|
110
|
+
}));
|
|
111
|
+
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, null,
|
|
112
|
+
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Success, null,
|
|
132
113
|
react_2.default.createElement("div", { "data-testid": "complete" }, "Complete!"))));
|
|
133
114
|
expect(react_1.screen.queryByTestId("complete")).not.toBeInTheDocument();
|
|
134
115
|
});
|
|
135
116
|
});
|
|
136
|
-
describe("
|
|
137
|
-
it("should render
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
};
|
|
144
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider,
|
|
145
|
-
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.
|
|
146
|
-
react_2.default.createElement("div", { "data-testid": "empty" }, "
|
|
117
|
+
describe("Pending Component", () => {
|
|
118
|
+
it("should render pending when no active status", () => {
|
|
119
|
+
jest.mocked(tambo_thread_provider_1.useTamboThread).mockReturnValue({
|
|
120
|
+
generationStage: generate_component_response_1.GenerationStage.IDLE,
|
|
121
|
+
});
|
|
122
|
+
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(createMockMessage({
|
|
123
|
+
component: createMockComponent({ title: "" }),
|
|
124
|
+
}));
|
|
125
|
+
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, null,
|
|
126
|
+
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Pending, null,
|
|
127
|
+
react_2.default.createElement("div", { "data-testid": "empty" }, "Empty!"))));
|
|
147
128
|
expect(react_1.screen.getByTestId("empty")).toBeInTheDocument();
|
|
148
129
|
});
|
|
149
|
-
it("should render
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
};
|
|
156
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider,
|
|
157
|
-
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.
|
|
158
|
-
react_2.default.createElement("div", { "data-testid": "empty" }, "
|
|
159
|
-
expect(react_1.screen.getByTestId("empty")).toBeInTheDocument();
|
|
160
|
-
});
|
|
161
|
-
it("should not render empty when loading", () => {
|
|
162
|
-
const streamStatus = {
|
|
163
|
-
isPending: true,
|
|
164
|
-
isStreaming: false,
|
|
165
|
-
isSuccess: false,
|
|
166
|
-
isError: false,
|
|
167
|
-
};
|
|
168
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, { data: null, streamStatus: streamStatus },
|
|
169
|
-
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Empty, null,
|
|
170
|
-
react_2.default.createElement("div", { "data-testid": "empty" }, "No data"))));
|
|
171
|
-
expect(react_1.screen.queryByTestId("empty")).not.toBeInTheDocument();
|
|
172
|
-
});
|
|
173
|
-
it("should not render empty when successful", () => {
|
|
174
|
-
const streamStatus = {
|
|
175
|
-
isPending: false,
|
|
176
|
-
isStreaming: false,
|
|
177
|
-
isSuccess: true,
|
|
178
|
-
isError: false,
|
|
179
|
-
};
|
|
180
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, { data: null, streamStatus: streamStatus },
|
|
181
|
-
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Empty, null,
|
|
182
|
-
react_2.default.createElement("div", { "data-testid": "empty" }, "No data"))));
|
|
130
|
+
it("should not render pending when isPending is true", () => {
|
|
131
|
+
jest.mocked(tambo_thread_provider_1.useTamboThread).mockReturnValue({
|
|
132
|
+
generationStage: generate_component_response_1.GenerationStage.STREAMING_RESPONSE,
|
|
133
|
+
});
|
|
134
|
+
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(createMockMessage({
|
|
135
|
+
component: createMockComponent({ title: "Partial" }),
|
|
136
|
+
}));
|
|
137
|
+
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, null,
|
|
138
|
+
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Pending, null,
|
|
139
|
+
react_2.default.createElement("div", { "data-testid": "empty" }, "Empty!"))));
|
|
183
140
|
expect(react_1.screen.queryByTestId("empty")).not.toBeInTheDocument();
|
|
184
141
|
});
|
|
185
142
|
});
|
|
186
143
|
});
|
|
187
|
-
describe("
|
|
188
|
-
it("should
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
expect(keyStatus.isSuccess).toBe(true); // name has data
|
|
200
|
-
});
|
|
201
|
-
it("should show loading for keys without data", () => {
|
|
202
|
-
const testData = { name: "John", age: null };
|
|
203
|
-
const streamStatus = {
|
|
204
|
-
isPending: false,
|
|
205
|
-
isStreaming: false,
|
|
206
|
-
isSuccess: true,
|
|
207
|
-
isError: false,
|
|
208
|
-
};
|
|
209
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, { data: testData, streamStatus: streamStatus },
|
|
210
|
-
react_2.default.createElement(TestHookComponent, { testKey: "age" })));
|
|
211
|
-
const keyStatus = JSON.parse(react_1.screen.getByTestId("key-status").textContent ?? "{}");
|
|
212
|
-
expect(keyStatus.isPending).toBe(true); // age has no data
|
|
213
|
-
});
|
|
214
|
-
it("should handle per-key loading states", () => {
|
|
215
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, { data: { name: "John", age: null } },
|
|
216
|
-
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Loading, { streamKey: "name" },
|
|
217
|
-
react_2.default.createElement("div", { "data-testid": "name-loading" }, "Name loading...")),
|
|
218
|
-
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Loading, { streamKey: "age" },
|
|
219
|
-
react_2.default.createElement("div", { "data-testid": "age-loading" }, "Age loading...")),
|
|
220
|
-
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Complete, { streamKey: "name" },
|
|
221
|
-
react_2.default.createElement("div", { "data-testid": "name-complete" }, "Name: John"))));
|
|
222
|
-
// Name should be complete (has data)
|
|
223
|
-
expect(react_1.screen.getByTestId("name-complete")).toBeInTheDocument();
|
|
224
|
-
expect(react_1.screen.queryByTestId("name-loading")).not.toBeInTheDocument();
|
|
225
|
-
// Age should be loading (no data)
|
|
226
|
-
expect(react_1.screen.getByTestId("age-loading")).toBeInTheDocument();
|
|
144
|
+
describe("Key-based Status", () => {
|
|
145
|
+
it("should provide status for keys not in propStatus", () => {
|
|
146
|
+
jest.mocked(tambo_thread_provider_1.useTamboThread).mockReturnValue({
|
|
147
|
+
generationStage: generate_component_response_1.GenerationStage.COMPLETE,
|
|
148
|
+
});
|
|
149
|
+
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(createMockMessage({
|
|
150
|
+
component: createMockComponent({ name: "John" }),
|
|
151
|
+
}));
|
|
152
|
+
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, null,
|
|
153
|
+
react_2.default.createElement(TestHookComponent, { testKey: "nonexistent" })));
|
|
154
|
+
const keyStatus = JSON.parse(react_1.screen.getByTestId("key-status").textContent);
|
|
155
|
+
expect(keyStatus.isPending).toBe(true);
|
|
227
156
|
});
|
|
228
157
|
});
|
|
229
|
-
describe("
|
|
230
|
-
it("should
|
|
231
|
-
(
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
react_2.default.createElement(
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
expect(react_1.screen.getByTestId("
|
|
250
|
-
|
|
251
|
-
it("should fallback to default status for unknown keys", () => {
|
|
252
|
-
const testData = { name: "John" };
|
|
253
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, { data: testData },
|
|
254
|
-
react_2.default.createElement(TestHookComponent, { testKey: "unknown-key" })));
|
|
255
|
-
const keyStatus = JSON.parse(react_1.screen.getByTestId("key-status").textContent ?? "{}");
|
|
256
|
-
// Should fallback to default status
|
|
257
|
-
expect(keyStatus.isSuccess).toBe(true);
|
|
158
|
+
describe("Compound Components with Keys", () => {
|
|
159
|
+
it("should render loading for specific key when pending", () => {
|
|
160
|
+
jest.mocked(tambo_thread_provider_1.useTamboThread).mockReturnValue({
|
|
161
|
+
generationStage: generate_component_response_1.GenerationStage.STREAMING_RESPONSE,
|
|
162
|
+
});
|
|
163
|
+
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(createMockMessage({
|
|
164
|
+
component: createMockComponent({
|
|
165
|
+
name: "Partial",
|
|
166
|
+
age: 25,
|
|
167
|
+
}),
|
|
168
|
+
}));
|
|
169
|
+
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, null,
|
|
170
|
+
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Streaming, { streamKey: "name" },
|
|
171
|
+
react_2.default.createElement("div", { "data-testid": "name-loading" }, "Name Loading...")),
|
|
172
|
+
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Streaming, { streamKey: "age" },
|
|
173
|
+
react_2.default.createElement("div", { "data-testid": "age-loading" }, "Age Loading...")),
|
|
174
|
+
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Success, { streamKey: "name" },
|
|
175
|
+
react_2.default.createElement("div", { "data-testid": "name-complete" }, "Name Complete!"))));
|
|
176
|
+
// Both props should be loading since they're in streaming stage
|
|
177
|
+
expect(react_1.screen.getByTestId("name-loading")).toBeInTheDocument();
|
|
178
|
+
expect(react_1.screen.getByTestId("age-loading")).toBeInTheDocument();
|
|
179
|
+
expect(react_1.screen.queryByTestId("name-complete")).not.toBeInTheDocument();
|
|
258
180
|
});
|
|
259
181
|
});
|
|
260
|
-
describe("
|
|
261
|
-
it("should
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
};
|
|
268
|
-
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider,
|
|
269
|
-
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.
|
|
270
|
-
react_2.default.createElement("div",
|
|
271
|
-
const loadingElement = react_1.screen.
|
|
272
|
-
expect(loadingElement).toHaveAttribute("data-stream-key", "default");
|
|
273
|
-
expect(loadingElement).toHaveAttribute("data-stream-state", "loading");
|
|
182
|
+
describe("Styling", () => {
|
|
183
|
+
it("should apply className to loading component", () => {
|
|
184
|
+
jest.mocked(tambo_thread_provider_1.useTamboThread).mockReturnValue({
|
|
185
|
+
generationStage: generate_component_response_1.GenerationStage.STREAMING_RESPONSE,
|
|
186
|
+
});
|
|
187
|
+
jest.mocked(use_current_message_1.useTamboCurrentMessage).mockReturnValue(createMockMessage({
|
|
188
|
+
component: createMockComponent({ title: "Partial" }),
|
|
189
|
+
}));
|
|
190
|
+
(0, react_1.render)(react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider, null,
|
|
191
|
+
react_2.default.createElement(tambo_prop_stream_provider_1.TamboPropStreamProvider.Streaming, { className: "loading-class" },
|
|
192
|
+
react_2.default.createElement("div", { "data-testid": "loading" }, "Loading..."))));
|
|
193
|
+
const loadingElement = react_1.screen.getByTestId("loading").parentElement;
|
|
274
194
|
expect(loadingElement).toHaveClass("loading-class");
|
|
275
195
|
});
|
|
276
196
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-prop-stream-provider.test.js","sourceRoot":"","sources":["../../../src/providers/__tests__/tambo-prop-stream-provider.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { render, screen } from \"@testing-library/react\";\nimport React from \"react\";\nimport { StreamStatus } from \"../../hooks/use-tambo-stream-status\";\nimport {\n TamboPropStreamProvider,\n useTamboStream,\n} from \"../tambo-prop-stream-provider\";\n\n// Helper component to test hook usage\nconst TestHookComponent: React.FC<{ testKey?: string }> = ({\n testKey = \"default\",\n}) => {\n const { data, streamStatus, getStatusForKey } = useTamboStream();\n const status = getStatusForKey(testKey);\n\n return (\n <div>\n <div data-testid=\"data\">{JSON.stringify(data)}</div>\n <div data-testid=\"stream-status\">{JSON.stringify(streamStatus)}</div>\n <div data-testid=\"key-status\">{JSON.stringify(status)}</div>\n </div>\n );\n};\n\ndescribe(\"TamboPropStreamProvider\", () => {\n describe(\"Hook Error Handling\", () => {\n it(\"should throw error when useTamboStream is used outside provider\", () => {\n // Suppress console.error for this test\n const originalError = console.error;\n console.error = jest.fn();\n\n expect(() => {\n render(<TestHookComponent />);\n }).toThrow(\n \"useTamboStream must be used within a TamboPropStreamProvider\",\n );\n\n console.error = originalError;\n });\n });\n\n describe(\"Basic Functionality\", () => {\n it(\"should provide data and stream status through context\", () => {\n const testData = { message: \"Hello World\" };\n const testStreamStatus: StreamStatus = {\n isPending: false,\n isStreaming: false,\n isSuccess: true,\n isError: false,\n streamError: undefined,\n };\n\n render(\n <TamboPropStreamProvider\n data={testData}\n streamStatus={testStreamStatus}\n >\n <TestHookComponent />\n </TamboPropStreamProvider>,\n );\n\n expect(screen.getByTestId(\"data\")).toHaveTextContent(\n JSON.stringify(testData),\n );\n expect(screen.getByTestId(\"stream-status\")).toHaveTextContent(\n JSON.stringify(testStreamStatus),\n );\n });\n\n it(\"should use default stream status when none provided\", () => {\n const testData = { message: \"Hello World\" };\n const expectedDefaultStatus = {\n isPending: false,\n isStreaming: false,\n isSuccess: true,\n isError: false,\n streamError: undefined,\n };\n\n render(\n <TamboPropStreamProvider data={testData}>\n <TestHookComponent />\n </TamboPropStreamProvider>,\n );\n\n expect(screen.getByTestId(\"stream-status\")).toHaveTextContent(\n JSON.stringify(expectedDefaultStatus),\n );\n });\n });\n\n describe(\"Compound Components\", () => {\n describe(\"Loading Component\", () => {\n it(\"should render loading when isPending is true\", () => {\n const streamStatus: StreamStatus = {\n isPending: true,\n isStreaming: false,\n isSuccess: false,\n isError: false,\n };\n\n render(\n <TamboPropStreamProvider data={null} streamStatus={streamStatus}>\n <TamboPropStreamProvider.Loading>\n <div data-testid=\"loading\">Loading...</div>\n </TamboPropStreamProvider.Loading>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.getByTestId(\"loading\")).toBeInTheDocument();\n });\n\n it(\"should render loading when isStreaming is true\", () => {\n const streamStatus: StreamStatus = {\n isPending: false,\n isStreaming: true,\n isSuccess: false,\n isError: false,\n };\n\n render(\n <TamboPropStreamProvider data={null} streamStatus={streamStatus}>\n <TamboPropStreamProvider.Loading>\n <div data-testid=\"loading\">Loading...</div>\n </TamboPropStreamProvider.Loading>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.getByTestId(\"loading\")).toBeInTheDocument();\n });\n\n it(\"should not render loading when not pending or streaming\", () => {\n const streamStatus: StreamStatus = {\n isPending: false,\n isStreaming: false,\n isSuccess: true,\n isError: false,\n };\n\n render(\n <TamboPropStreamProvider data=\"test\" streamStatus={streamStatus}>\n <TamboPropStreamProvider.Loading>\n <div data-testid=\"loading\">Loading...</div>\n </TamboPropStreamProvider.Loading>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.queryByTestId(\"loading\")).not.toBeInTheDocument();\n });\n });\n\n describe(\"Complete Component\", () => {\n it(\"should render complete when isSuccess is true and data exists\", () => {\n const streamStatus: StreamStatus = {\n isPending: false,\n isStreaming: false,\n isSuccess: true,\n isError: false,\n };\n\n render(\n <TamboPropStreamProvider data=\"test data\" streamStatus={streamStatus}>\n <TamboPropStreamProvider.Complete>\n <div data-testid=\"complete\">Complete!</div>\n </TamboPropStreamProvider.Complete>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.getByTestId(\"complete\")).toBeInTheDocument();\n });\n\n it(\"should not render complete when data is null\", () => {\n const streamStatus: StreamStatus = {\n isPending: false,\n isStreaming: false,\n isSuccess: true,\n isError: false,\n };\n\n render(\n <TamboPropStreamProvider data={null} streamStatus={streamStatus}>\n <TamboPropStreamProvider.Complete>\n <div data-testid=\"complete\">Complete!</div>\n </TamboPropStreamProvider.Complete>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.queryByTestId(\"complete\")).not.toBeInTheDocument();\n });\n\n it(\"should not render complete when data is undefined\", () => {\n const streamStatus: StreamStatus = {\n isPending: false,\n isStreaming: false,\n isSuccess: true,\n isError: false,\n };\n\n render(\n <TamboPropStreamProvider data={undefined} streamStatus={streamStatus}>\n <TamboPropStreamProvider.Complete>\n <div data-testid=\"complete\">Complete!</div>\n </TamboPropStreamProvider.Complete>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.queryByTestId(\"complete\")).not.toBeInTheDocument();\n });\n });\n\n describe(\"Empty Component\", () => {\n it(\"should render empty when no data and not loading/streaming/success/error\", () => {\n const streamStatus: StreamStatus = {\n isPending: false,\n isStreaming: false,\n isSuccess: false,\n isError: false,\n };\n\n render(\n <TamboPropStreamProvider data={null} streamStatus={streamStatus}>\n <TamboPropStreamProvider.Empty>\n <div data-testid=\"empty\">No data</div>\n </TamboPropStreamProvider.Empty>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.getByTestId(\"empty\")).toBeInTheDocument();\n });\n\n it(\"should render empty when data is empty string\", () => {\n const streamStatus: StreamStatus = {\n isPending: false,\n isStreaming: false,\n isSuccess: false,\n isError: false,\n };\n\n render(\n <TamboPropStreamProvider data=\"\" streamStatus={streamStatus}>\n <TamboPropStreamProvider.Empty>\n <div data-testid=\"empty\">No data</div>\n </TamboPropStreamProvider.Empty>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.getByTestId(\"empty\")).toBeInTheDocument();\n });\n\n it(\"should not render empty when loading\", () => {\n const streamStatus: StreamStatus = {\n isPending: true,\n isStreaming: false,\n isSuccess: false,\n isError: false,\n };\n\n render(\n <TamboPropStreamProvider data={null} streamStatus={streamStatus}>\n <TamboPropStreamProvider.Empty>\n <div data-testid=\"empty\">No data</div>\n </TamboPropStreamProvider.Empty>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.queryByTestId(\"empty\")).not.toBeInTheDocument();\n });\n\n it(\"should not render empty when successful\", () => {\n const streamStatus: StreamStatus = {\n isPending: false,\n isStreaming: false,\n isSuccess: true,\n isError: false,\n };\n\n render(\n <TamboPropStreamProvider data={null} streamStatus={streamStatus}>\n <TamboPropStreamProvider.Empty>\n <div data-testid=\"empty\">No data</div>\n </TamboPropStreamProvider.Empty>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.queryByTestId(\"empty\")).not.toBeInTheDocument();\n });\n });\n });\n\n describe(\"Per-Key Status Tracking\", () => {\n it(\"should track status for object keys\", () => {\n const testData = { name: \"John\", age: null };\n const streamStatus: StreamStatus = {\n isPending: false,\n isStreaming: false,\n isSuccess: true,\n isError: false,\n };\n\n render(\n <TamboPropStreamProvider data={testData} streamStatus={streamStatus}>\n <TestHookComponent testKey=\"name\" />\n </TamboPropStreamProvider>,\n );\n\n const keyStatus = JSON.parse(\n screen.getByTestId(\"key-status\").textContent ?? \"{}\",\n );\n expect(keyStatus.isSuccess).toBe(true); // name has data\n });\n\n it(\"should show loading for keys without data\", () => {\n const testData = { name: \"John\", age: null };\n const streamStatus: StreamStatus = {\n isPending: false,\n isStreaming: false,\n isSuccess: true,\n isError: false,\n };\n\n render(\n <TamboPropStreamProvider data={testData} streamStatus={streamStatus}>\n <TestHookComponent testKey=\"age\" />\n </TamboPropStreamProvider>,\n );\n\n const keyStatus = JSON.parse(\n screen.getByTestId(\"key-status\").textContent ?? \"{}\",\n );\n expect(keyStatus.isPending).toBe(true); // age has no data\n });\n\n it(\"should handle per-key loading states\", () => {\n render(\n <TamboPropStreamProvider data={{ name: \"John\", age: null }}>\n <TamboPropStreamProvider.Loading streamKey=\"name\">\n <div data-testid=\"name-loading\">Name loading...</div>\n </TamboPropStreamProvider.Loading>\n <TamboPropStreamProvider.Loading streamKey=\"age\">\n <div data-testid=\"age-loading\">Age loading...</div>\n </TamboPropStreamProvider.Loading>\n <TamboPropStreamProvider.Complete streamKey=\"name\">\n <div data-testid=\"name-complete\">Name: John</div>\n </TamboPropStreamProvider.Complete>\n </TamboPropStreamProvider>,\n );\n\n // Name should be complete (has data)\n expect(screen.getByTestId(\"name-complete\")).toBeInTheDocument();\n expect(screen.queryByTestId(\"name-loading\")).not.toBeInTheDocument();\n\n // Age should be loading (no data)\n expect(screen.getByTestId(\"age-loading\")).toBeInTheDocument();\n });\n });\n\n describe(\"Edge Cases\", () => {\n it(\"should handle null data gracefully\", () => {\n render(\n <TamboPropStreamProvider data={null}>\n <TestHookComponent />\n </TamboPropStreamProvider>,\n );\n\n expect(screen.getByTestId(\"data\")).toHaveTextContent(\"null\");\n });\n\n it(\"should handle undefined data gracefully\", () => {\n render(\n <TamboPropStreamProvider data={undefined}>\n <TestHookComponent />\n </TamboPropStreamProvider>,\n );\n\n expect(screen.getByTestId(\"data\")).toHaveTextContent(\"\");\n });\n\n it(\"should handle array data\", () => {\n const arrayData = [\"item1\", \"item2\"];\n render(\n <TamboPropStreamProvider data={arrayData}>\n <TestHookComponent />\n </TamboPropStreamProvider>,\n );\n\n expect(screen.getByTestId(\"data\")).toHaveTextContent(\n JSON.stringify(arrayData),\n );\n });\n\n it(\"should handle primitive data types\", () => {\n render(\n <TamboPropStreamProvider data=\"string data\">\n <TestHookComponent />\n </TamboPropStreamProvider>,\n );\n\n expect(screen.getByTestId(\"data\")).toHaveTextContent('\"string data\"');\n });\n\n it(\"should fallback to default status for unknown keys\", () => {\n const testData = { name: \"John\" };\n\n render(\n <TamboPropStreamProvider data={testData}>\n <TestHookComponent testKey=\"unknown-key\" />\n </TamboPropStreamProvider>,\n );\n\n const keyStatus = JSON.parse(\n screen.getByTestId(\"key-status\").textContent ?? \"{}\",\n );\n // Should fallback to default status\n expect(keyStatus.isSuccess).toBe(true);\n });\n });\n\n describe(\"Component Attributes\", () => {\n it(\"should add correct data attributes to components\", () => {\n const streamStatus: StreamStatus = {\n isPending: true,\n isStreaming: false,\n isSuccess: false,\n isError: false,\n };\n\n render(\n <TamboPropStreamProvider data={null} streamStatus={streamStatus}>\n <TamboPropStreamProvider.Loading className=\"loading-class\">\n <div>Loading...</div>\n </TamboPropStreamProvider.Loading>\n </TamboPropStreamProvider>,\n );\n\n const loadingElement = screen.getByText(\"Loading...\").parentElement;\n expect(loadingElement).toHaveAttribute(\"data-stream-key\", \"default\");\n expect(loadingElement).toHaveAttribute(\"data-stream-state\", \"loading\");\n expect(loadingElement).toHaveClass(\"loading-class\");\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"tambo-prop-stream-provider.test.js","sourceRoot":"","sources":["../../../src/providers/__tests__/tambo-prop-stream-provider.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { render, screen } from \"@testing-library/react\";\nimport React from \"react\";\nimport { useTamboCurrentMessage } from \"../../hooks/use-current-message\";\nimport {\n GenerationStage,\n TamboThreadMessage,\n} from \"../../model/generate-component-response\";\nimport {\n TamboThreadContextProps,\n useTamboThread,\n} from \"../../providers/tambo-thread-provider\";\nimport {\n TamboPropStreamProvider,\n useTamboStream,\n} from \"../tambo-prop-stream-provider\";\n\n// Mock the required providers\njest.mock(\"../../providers/tambo-thread-provider\", () => ({\n useTamboThread: jest.fn(),\n}));\n\njest.mock(\"../../hooks/use-current-message\", () => ({\n useTamboCurrentMessage: jest.fn(),\n}));\n\n// Mock window for SSR tests\nconst originalWindow = global.window;\n\n// Helper function to create mock ComponentDecisionV2\nconst createMockComponent = (props: Record<string, unknown> = {}): any => ({\n componentName: \"TestComponent\",\n componentState: {},\n message: \"Component generated\",\n props,\n reasoning: \"Test reasoning\",\n});\n\n// Helper function to create mock TamboThreadMessage\nconst createMockMessage = (\n overrides: Partial<TamboThreadMessage> = {},\n): TamboThreadMessage => ({\n id: \"test-message\",\n componentState: {},\n content: [{ type: \"text\", text: \"test content\" }],\n createdAt: new Date().toISOString(),\n role: \"assistant\",\n threadId: \"test-thread\",\n ...overrides,\n});\n\n// Helper component to test hook usage\nconst TestHookComponent: React.FC<{ testKey?: string }> = ({\n testKey = \"default\",\n}) => {\n const { streamStatus, getStatusForKey } = useTamboStream();\n const status = getStatusForKey(testKey);\n\n return (\n <div>\n <div data-testid=\"stream-status\">{JSON.stringify(streamStatus)}</div>\n <div data-testid=\"key-status\">{JSON.stringify(status)}</div>\n </div>\n );\n};\n\ndescribe(\"TamboPropStreamProvider\", () => {\n beforeEach(() => {\n // Restore window for client-side tests\n global.window = originalWindow;\n\n // Default mock implementations\n jest.mocked(useTamboThread).mockReturnValue({\n generationStage: GenerationStage.IDLE,\n } as TamboThreadContextProps);\n\n jest.mocked(useTamboCurrentMessage).mockReturnValue({\n id: \"test-message\",\n component: {\n props: {},\n },\n } as TamboThreadMessage);\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n describe(\"Hook Error Handling\", () => {\n it(\"should throw error when useTamboStream is used outside provider\", () => {\n // Suppress console.error for this test\n const originalError = console.error;\n console.error = jest.fn();\n\n expect(() => {\n render(<TestHookComponent />);\n }).toThrow(\n \"useTamboStream must be used within a TamboPropStreamProvider\",\n );\n\n console.error = originalError;\n });\n });\n\n describe(\"Compound Components\", () => {\n describe(\"Streaming Component\", () => {\n it(\"should render streaming when isPending is true\", () => {\n jest.mocked(useTamboThread).mockReturnValue({\n generationStage: GenerationStage.IDLE,\n } as TamboThreadContextProps);\n\n jest.mocked(useTamboCurrentMessage).mockReturnValue(\n createMockMessage({\n component: createMockComponent({ title: \"\" }),\n }),\n );\n\n render(\n <TamboPropStreamProvider>\n <TamboPropStreamProvider.Streaming>\n <div data-testid=\"loading\">Loading...</div>\n </TamboPropStreamProvider.Streaming>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.getByTestId(\"loading\")).toBeInTheDocument();\n });\n\n it(\"should render streaming when isStreaming is true\", () => {\n jest.mocked(useTamboThread).mockReturnValue({\n generationStage: GenerationStage.STREAMING_RESPONSE,\n } as TamboThreadContextProps);\n\n jest.mocked(useTamboCurrentMessage).mockReturnValue(\n createMockMessage({\n component: createMockComponent({ title: \"Partial\" }),\n }),\n );\n\n render(\n <TamboPropStreamProvider>\n <TamboPropStreamProvider.Streaming>\n <div data-testid=\"loading\">Loading...</div>\n </TamboPropStreamProvider.Streaming>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.getByTestId(\"loading\")).toBeInTheDocument();\n });\n });\n\n describe(\"Success Component\", () => {\n it(\"should not render success when isSuccess is false\", () => {\n jest.mocked(useTamboThread).mockReturnValue({\n generationStage: GenerationStage.IDLE,\n } as TamboThreadContextProps);\n\n jest.mocked(useTamboCurrentMessage).mockReturnValue(\n createMockMessage({\n component: createMockComponent({ title: \"\" }),\n }),\n );\n\n render(\n <TamboPropStreamProvider>\n <TamboPropStreamProvider.Success>\n <div data-testid=\"complete\">Complete!</div>\n </TamboPropStreamProvider.Success>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.queryByTestId(\"complete\")).not.toBeInTheDocument();\n });\n });\n\n describe(\"Pending Component\", () => {\n it(\"should render pending when no active status\", () => {\n jest.mocked(useTamboThread).mockReturnValue({\n generationStage: GenerationStage.IDLE,\n } as TamboThreadContextProps);\n\n jest.mocked(useTamboCurrentMessage).mockReturnValue(\n createMockMessage({\n component: createMockComponent({ title: \"\" }),\n }),\n );\n\n render(\n <TamboPropStreamProvider>\n <TamboPropStreamProvider.Pending>\n <div data-testid=\"empty\">Empty!</div>\n </TamboPropStreamProvider.Pending>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.getByTestId(\"empty\")).toBeInTheDocument();\n });\n\n it(\"should not render pending when isPending is true\", () => {\n jest.mocked(useTamboThread).mockReturnValue({\n generationStage: GenerationStage.STREAMING_RESPONSE,\n } as TamboThreadContextProps);\n\n jest.mocked(useTamboCurrentMessage).mockReturnValue(\n createMockMessage({\n component: createMockComponent({ title: \"Partial\" }),\n }),\n );\n\n render(\n <TamboPropStreamProvider>\n <TamboPropStreamProvider.Pending>\n <div data-testid=\"empty\">Empty!</div>\n </TamboPropStreamProvider.Pending>\n </TamboPropStreamProvider>,\n );\n\n expect(screen.queryByTestId(\"empty\")).not.toBeInTheDocument();\n });\n });\n });\n\n describe(\"Key-based Status\", () => {\n it(\"should provide status for keys not in propStatus\", () => {\n jest.mocked(useTamboThread).mockReturnValue({\n generationStage: GenerationStage.COMPLETE,\n } as TamboThreadContextProps);\n\n jest.mocked(useTamboCurrentMessage).mockReturnValue(\n createMockMessage({\n component: createMockComponent({ name: \"John\" }),\n }),\n );\n\n render(\n <TamboPropStreamProvider>\n <TestHookComponent testKey=\"nonexistent\" />\n </TamboPropStreamProvider>,\n );\n\n const keyStatus = JSON.parse(\n screen.getByTestId(\"key-status\").textContent!,\n );\n expect(keyStatus.isPending).toBe(true);\n });\n });\n\n describe(\"Compound Components with Keys\", () => {\n it(\"should render loading for specific key when pending\", () => {\n jest.mocked(useTamboThread).mockReturnValue({\n generationStage: GenerationStage.STREAMING_RESPONSE,\n } as TamboThreadContextProps);\n\n jest.mocked(useTamboCurrentMessage).mockReturnValue(\n createMockMessage({\n component: createMockComponent({\n name: \"Partial\",\n age: 25,\n }),\n }),\n );\n\n render(\n <TamboPropStreamProvider>\n <TamboPropStreamProvider.Streaming streamKey=\"name\">\n <div data-testid=\"name-loading\">Name Loading...</div>\n </TamboPropStreamProvider.Streaming>\n <TamboPropStreamProvider.Streaming streamKey=\"age\">\n <div data-testid=\"age-loading\">Age Loading...</div>\n </TamboPropStreamProvider.Streaming>\n <TamboPropStreamProvider.Success streamKey=\"name\">\n <div data-testid=\"name-complete\">Name Complete!</div>\n </TamboPropStreamProvider.Success>\n </TamboPropStreamProvider>,\n );\n\n // Both props should be loading since they're in streaming stage\n expect(screen.getByTestId(\"name-loading\")).toBeInTheDocument();\n expect(screen.getByTestId(\"age-loading\")).toBeInTheDocument();\n expect(screen.queryByTestId(\"name-complete\")).not.toBeInTheDocument();\n });\n });\n\n describe(\"Styling\", () => {\n it(\"should apply className to loading component\", () => {\n jest.mocked(useTamboThread).mockReturnValue({\n generationStage: GenerationStage.STREAMING_RESPONSE,\n } as TamboThreadContextProps);\n\n jest.mocked(useTamboCurrentMessage).mockReturnValue(\n createMockMessage({\n component: createMockComponent({ title: \"Partial\" }),\n }),\n );\n\n render(\n <TamboPropStreamProvider>\n <TamboPropStreamProvider.Streaming className=\"loading-class\">\n <div data-testid=\"loading\">Loading...</div>\n </TamboPropStreamProvider.Streaming>\n </TamboPropStreamProvider>,\n );\n\n const loadingElement = screen.getByTestId(\"loading\").parentElement;\n expect(loadingElement).toHaveClass(\"loading-class\");\n });\n });\n});\n"]}
|