@tinybirdco/sdk 0.0.28 → 0.0.30

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 CHANGED
@@ -294,6 +294,21 @@ tinybird branch status # Show current branch status
294
294
  tinybird branch delete <name> # Delete a branch
295
295
  ```
296
296
 
297
+ ### `tinybird info`
298
+
299
+ Display information about the current project and workspace.
300
+
301
+ ```bash
302
+ tinybird info # Show workspace, local, and project info
303
+ tinybird info --json # Output as JSON
304
+ ```
305
+
306
+ Shows:
307
+ - **Workspace**: Cloud workspace details (name, ID, user, API host, dashboard URL, token)
308
+ - **Local**: Local Tinybird container info (when `devMode` is `local`)
309
+ - **Branch**: Current branch details (when `devMode` is `branch` and on a feature branch)
310
+ - **Project**: Configuration and git information
311
+
297
312
  ## Configuration
298
313
 
299
314
  Create a `tinybird.json` in your project root:
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Info command - shows information about the current project and workspace
3
+ */
4
+ import { type TinybirdBranch } from "../../api/branches.js";
5
+ /**
6
+ * Info command options
7
+ */
8
+ export interface InfoCommandOptions {
9
+ /** Working directory (defaults to cwd) */
10
+ cwd?: string;
11
+ /** Output as JSON */
12
+ json?: boolean;
13
+ }
14
+ /**
15
+ * Cloud/workspace information
16
+ */
17
+ export interface CloudInfo {
18
+ /** Workspace name */
19
+ workspaceName: string;
20
+ /** Workspace ID */
21
+ workspaceId: string;
22
+ /** User email */
23
+ userEmail: string;
24
+ /** API host URL */
25
+ apiHost: string;
26
+ /** Dashboard URL */
27
+ dashboardUrl?: string;
28
+ /** Token */
29
+ token: string;
30
+ }
31
+ /**
32
+ * Project configuration information
33
+ */
34
+ export interface ProjectInfo {
35
+ /** Current working directory */
36
+ cwd: string;
37
+ /** Path to tinybird.json */
38
+ configPath: string;
39
+ /** Development mode */
40
+ devMode: string;
41
+ /** Git branch */
42
+ gitBranch: string | null;
43
+ /** Tinybird branch (sanitized) */
44
+ tinybirdBranch: string | null;
45
+ /** Whether on main branch */
46
+ isMainBranch: boolean;
47
+ }
48
+ /**
49
+ * Current branch information (when working on a branch)
50
+ */
51
+ export interface BranchInfo {
52
+ /** Branch name */
53
+ name: string;
54
+ /** Branch ID */
55
+ id: string;
56
+ /** Branch token */
57
+ token: string;
58
+ /** Dashboard URL */
59
+ dashboardUrl?: string;
60
+ }
61
+ /**
62
+ * Local Tinybird workspace information
63
+ */
64
+ export interface LocalInfo {
65
+ /** Whether local Tinybird is running */
66
+ running: boolean;
67
+ /** Workspace name */
68
+ workspaceName?: string;
69
+ /** Workspace ID */
70
+ workspaceId?: string;
71
+ /** API host URL */
72
+ apiHost: string;
73
+ /** Dashboard URL */
74
+ dashboardUrl?: string;
75
+ /** Token */
76
+ token?: string;
77
+ }
78
+ /**
79
+ * Result of the info command
80
+ */
81
+ export interface InfoCommandResult {
82
+ /** Whether the operation was successful */
83
+ success: boolean;
84
+ /** Cloud/workspace info */
85
+ cloud?: CloudInfo;
86
+ /** Local workspace info (when devMode is local) */
87
+ local?: LocalInfo;
88
+ /** Project info */
89
+ project?: ProjectInfo;
90
+ /** Current branch info (if on a branch) */
91
+ branch?: BranchInfo;
92
+ /** List of all branches */
93
+ branches?: TinybirdBranch[];
94
+ /** Error message if failed */
95
+ error?: string;
96
+ }
97
+ /**
98
+ * Run the info command
99
+ *
100
+ * @param options - Command options
101
+ * @returns Info result
102
+ */
103
+ export declare function runInfo(options?: InfoCommandOptions): Promise<InfoCommandResult>;
104
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AASrF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kCAAkC;IAClC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,6BAA6B;IAC7B,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,mDAAmD;IACnD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,mBAAmB;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAmI5B"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Info command - shows information about the current project and workspace
3
+ */
4
+ import { loadConfig, LOCAL_BASE_URL } from "../config.js";
5
+ import { getWorkspace } from "../../api/workspaces.js";
6
+ import { listBranches, getBranch } from "../../api/branches.js";
7
+ import { getDashboardUrl, getBranchDashboardUrl, getLocalDashboardUrl } from "../../api/dashboard.js";
8
+ import { isLocalRunning, getLocalTokens, getOrCreateLocalWorkspace, getLocalWorkspaceName, } from "../../api/local.js";
9
+ /**
10
+ * Run the info command
11
+ *
12
+ * @param options - Command options
13
+ * @returns Info result
14
+ */
15
+ export async function runInfo(options = {}) {
16
+ const cwd = options.cwd ?? process.cwd();
17
+ // Load config
18
+ let config;
19
+ try {
20
+ config = loadConfig(cwd);
21
+ }
22
+ catch (error) {
23
+ return {
24
+ success: false,
25
+ error: error.message,
26
+ };
27
+ }
28
+ // Build project info first (always available)
29
+ const projectInfo = {
30
+ cwd: config.cwd,
31
+ configPath: config.configPath,
32
+ devMode: config.devMode,
33
+ gitBranch: config.gitBranch,
34
+ tinybirdBranch: config.tinybirdBranch,
35
+ isMainBranch: config.isMainBranch,
36
+ };
37
+ // Always get cloud/workspace info first (needed for local workspace name on main branch)
38
+ let workspace;
39
+ try {
40
+ workspace = await getWorkspace({
41
+ baseUrl: config.baseUrl,
42
+ token: config.token,
43
+ });
44
+ }
45
+ catch (error) {
46
+ return {
47
+ success: false,
48
+ error: `Failed to get workspace info: ${error.message}`,
49
+ };
50
+ }
51
+ // Build cloud info
52
+ const cloudInfo = {
53
+ workspaceName: workspace.name,
54
+ workspaceId: workspace.id,
55
+ userEmail: workspace.user_email,
56
+ apiHost: config.baseUrl,
57
+ dashboardUrl: getDashboardUrl(config.baseUrl, workspace.name) ?? undefined,
58
+ token: config.token,
59
+ };
60
+ // Get local info if in local mode
61
+ let localInfo;
62
+ if (config.devMode === "local") {
63
+ const localRunning = await isLocalRunning();
64
+ localInfo = {
65
+ running: localRunning,
66
+ apiHost: LOCAL_BASE_URL,
67
+ };
68
+ if (localRunning) {
69
+ try {
70
+ const tokens = await getLocalTokens();
71
+ // Determine workspace name: use authenticated workspace name on main branch,
72
+ // otherwise use branch name (for trunk-based development support)
73
+ let workspaceName;
74
+ if (config.isMainBranch || !config.tinybirdBranch) {
75
+ // On main branch: use the authenticated workspace name
76
+ workspaceName = workspace.name;
77
+ }
78
+ else {
79
+ // On feature branch: use branch name
80
+ workspaceName = getLocalWorkspaceName(config.tinybirdBranch, config.cwd);
81
+ }
82
+ const { workspace: localWorkspace } = await getOrCreateLocalWorkspace(tokens, workspaceName);
83
+ localInfo = {
84
+ running: true,
85
+ workspaceName: localWorkspace.name,
86
+ workspaceId: localWorkspace.id,
87
+ apiHost: LOCAL_BASE_URL,
88
+ dashboardUrl: getLocalDashboardUrl(localWorkspace.name),
89
+ token: localWorkspace.token,
90
+ };
91
+ }
92
+ catch {
93
+ // Local is running but couldn't get workspace info
94
+ }
95
+ }
96
+ }
97
+ // Get current branch info only if we're in branch mode (not local mode)
98
+ let branchInfo;
99
+ let branches = [];
100
+ if (config.devMode === "branch") {
101
+ // Get current branch info if we're on a branch (not main)
102
+ if (!config.isMainBranch && config.tinybirdBranch) {
103
+ try {
104
+ const branch = await getBranch({
105
+ baseUrl: config.baseUrl,
106
+ token: config.token,
107
+ }, config.tinybirdBranch);
108
+ const dashboardUrl = getBranchDashboardUrl(config.baseUrl, workspace.name, branch.name) ?? undefined;
109
+ branchInfo = {
110
+ name: branch.name,
111
+ id: branch.id,
112
+ token: branch.token ?? "",
113
+ dashboardUrl,
114
+ };
115
+ }
116
+ catch {
117
+ // Branch might not exist yet, that's ok
118
+ }
119
+ }
120
+ // Get all branches
121
+ try {
122
+ branches = await listBranches({
123
+ baseUrl: config.baseUrl,
124
+ token: config.token,
125
+ });
126
+ }
127
+ catch {
128
+ // Branches are optional, don't fail if we can't fetch them
129
+ }
130
+ }
131
+ return {
132
+ success: true,
133
+ cloud: cloudInfo,
134
+ local: localInfo,
135
+ project: projectInfo,
136
+ branch: branchInfo,
137
+ branches,
138
+ };
139
+ }
140
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=info.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/info.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,338 @@
1
+ import { describe, it, expect, beforeEach, vi } from "vitest";
2
+ import { runInfo } from "./info.js";
3
+ // Mock the config module
4
+ vi.mock("../config.js", () => ({
5
+ loadConfig: vi.fn(),
6
+ LOCAL_BASE_URL: "http://localhost:7181",
7
+ }));
8
+ // Mock the API modules
9
+ vi.mock("../../api/workspaces.js", () => ({
10
+ getWorkspace: vi.fn(),
11
+ }));
12
+ vi.mock("../../api/branches.js", () => ({
13
+ listBranches: vi.fn(),
14
+ getBranch: vi.fn(),
15
+ }));
16
+ vi.mock("../../api/dashboard.js", () => ({
17
+ getDashboardUrl: vi.fn(),
18
+ getBranchDashboardUrl: vi.fn(),
19
+ getLocalDashboardUrl: vi.fn(),
20
+ }));
21
+ vi.mock("../../api/local.js", () => ({
22
+ isLocalRunning: vi.fn(),
23
+ getLocalTokens: vi.fn(),
24
+ getOrCreateLocalWorkspace: vi.fn(),
25
+ getLocalWorkspaceName: vi.fn(),
26
+ }));
27
+ // Import mocked functions
28
+ import { loadConfig } from "../config.js";
29
+ import { getWorkspace } from "../../api/workspaces.js";
30
+ import { listBranches, getBranch } from "../../api/branches.js";
31
+ import { getDashboardUrl, getBranchDashboardUrl, getLocalDashboardUrl } from "../../api/dashboard.js";
32
+ import { isLocalRunning, getLocalTokens, getOrCreateLocalWorkspace, getLocalWorkspaceName, } from "../../api/local.js";
33
+ const mockedLoadConfig = vi.mocked(loadConfig);
34
+ const mockedGetWorkspace = vi.mocked(getWorkspace);
35
+ const mockedListBranches = vi.mocked(listBranches);
36
+ const mockedGetBranch = vi.mocked(getBranch);
37
+ const mockedGetDashboardUrl = vi.mocked(getDashboardUrl);
38
+ const mockedGetBranchDashboardUrl = vi.mocked(getBranchDashboardUrl);
39
+ const mockedGetLocalDashboardUrl = vi.mocked(getLocalDashboardUrl);
40
+ const mockedIsLocalRunning = vi.mocked(isLocalRunning);
41
+ const mockedGetLocalTokens = vi.mocked(getLocalTokens);
42
+ const mockedGetOrCreateLocalWorkspace = vi.mocked(getOrCreateLocalWorkspace);
43
+ const mockedGetLocalWorkspaceName = vi.mocked(getLocalWorkspaceName);
44
+ describe("Info Command", () => {
45
+ beforeEach(() => {
46
+ vi.clearAllMocks();
47
+ });
48
+ describe("config loading", () => {
49
+ it("returns error when config loading fails", async () => {
50
+ mockedLoadConfig.mockImplementation(() => {
51
+ throw new Error("No tinybird.json found");
52
+ });
53
+ const result = await runInfo();
54
+ expect(result.success).toBe(false);
55
+ expect(result.error).toContain("No tinybird.json found");
56
+ });
57
+ });
58
+ describe("branch mode", () => {
59
+ const mockConfig = {
60
+ cwd: "/test/project",
61
+ configPath: "/test/project/tinybird.json",
62
+ devMode: "branch",
63
+ gitBranch: "feature/test",
64
+ tinybirdBranch: "feature_test",
65
+ isMainBranch: false,
66
+ baseUrl: "https://api.tinybird.co",
67
+ token: "test-token",
68
+ include: [],
69
+ };
70
+ const mockWorkspace = {
71
+ id: "ws-123",
72
+ name: "test-workspace",
73
+ user_email: "user@example.com",
74
+ user_id: "user-123",
75
+ scope: "WORKSPACE",
76
+ main: null,
77
+ };
78
+ beforeEach(() => {
79
+ mockedLoadConfig.mockReturnValue(mockConfig);
80
+ mockedGetWorkspace.mockResolvedValue(mockWorkspace);
81
+ mockedListBranches.mockResolvedValue([]);
82
+ mockedGetDashboardUrl.mockReturnValue("https://cloud.tinybird.co/gcp/europe-west3/test-workspace");
83
+ });
84
+ it("returns cloud info in branch mode", async () => {
85
+ const result = await runInfo();
86
+ expect(result.success).toBe(true);
87
+ expect(result.cloud).toEqual({
88
+ workspaceName: "test-workspace",
89
+ workspaceId: "ws-123",
90
+ userEmail: "user@example.com",
91
+ apiHost: "https://api.tinybird.co",
92
+ dashboardUrl: "https://cloud.tinybird.co/gcp/europe-west3/test-workspace",
93
+ token: "test-token",
94
+ });
95
+ });
96
+ it("does not return local info in branch mode", async () => {
97
+ const result = await runInfo();
98
+ expect(result.success).toBe(true);
99
+ expect(result.local).toBeUndefined();
100
+ expect(mockedIsLocalRunning).not.toHaveBeenCalled();
101
+ });
102
+ it("returns project info", async () => {
103
+ const result = await runInfo();
104
+ expect(result.success).toBe(true);
105
+ expect(result.project).toEqual({
106
+ cwd: "/test/project",
107
+ configPath: "/test/project/tinybird.json",
108
+ devMode: "branch",
109
+ gitBranch: "feature/test",
110
+ tinybirdBranch: "feature_test",
111
+ isMainBranch: false,
112
+ });
113
+ });
114
+ it("returns branch info when on a feature branch", async () => {
115
+ const mockBranch = {
116
+ id: "branch-123",
117
+ name: "feature_test",
118
+ token: "branch-token",
119
+ created_at: "2024-01-01",
120
+ };
121
+ mockedGetBranch.mockResolvedValue(mockBranch);
122
+ mockedGetBranchDashboardUrl.mockReturnValue("https://cloud.tinybird.co/gcp/europe-west3/test-workspace~feature_test");
123
+ const result = await runInfo();
124
+ expect(result.success).toBe(true);
125
+ expect(result.branch).toEqual({
126
+ name: "feature_test",
127
+ id: "branch-123",
128
+ token: "branch-token",
129
+ dashboardUrl: "https://cloud.tinybird.co/gcp/europe-west3/test-workspace~feature_test",
130
+ });
131
+ });
132
+ it("does not return branch info when on main branch", async () => {
133
+ mockedLoadConfig.mockReturnValue({
134
+ ...mockConfig,
135
+ gitBranch: "main",
136
+ tinybirdBranch: null,
137
+ isMainBranch: true,
138
+ });
139
+ const result = await runInfo();
140
+ expect(result.success).toBe(true);
141
+ expect(result.branch).toBeUndefined();
142
+ expect(mockedGetBranch).not.toHaveBeenCalled();
143
+ });
144
+ it("returns branches list in branch mode", async () => {
145
+ const mockBranches = [
146
+ { id: "b1", name: "branch1", created_at: "2024-01-01" },
147
+ { id: "b2", name: "branch2", created_at: "2024-01-02" },
148
+ ];
149
+ mockedListBranches.mockResolvedValue(mockBranches);
150
+ const result = await runInfo();
151
+ expect(result.success).toBe(true);
152
+ expect(result.branches).toEqual(mockBranches);
153
+ });
154
+ });
155
+ describe("local mode", () => {
156
+ const mockConfig = {
157
+ cwd: "/test/project",
158
+ configPath: "/test/project/tinybird.json",
159
+ devMode: "local",
160
+ gitBranch: "feature/test",
161
+ tinybirdBranch: "feature_test",
162
+ isMainBranch: false,
163
+ baseUrl: "https://api.tinybird.co",
164
+ token: "test-token",
165
+ include: [],
166
+ };
167
+ const mockWorkspace = {
168
+ id: "ws-123",
169
+ name: "test-workspace",
170
+ user_email: "user@example.com",
171
+ user_id: "user-123",
172
+ scope: "WORKSPACE",
173
+ main: null,
174
+ };
175
+ beforeEach(() => {
176
+ mockedLoadConfig.mockReturnValue(mockConfig);
177
+ mockedGetWorkspace.mockResolvedValue(mockWorkspace);
178
+ mockedGetDashboardUrl.mockReturnValue("https://cloud.tinybird.co/gcp/europe-west3/test-workspace");
179
+ });
180
+ it("returns cloud info in local mode", async () => {
181
+ mockedIsLocalRunning.mockResolvedValue(false);
182
+ const result = await runInfo();
183
+ expect(result.success).toBe(true);
184
+ expect(result.cloud).toBeDefined();
185
+ expect(result.cloud?.workspaceName).toBe("test-workspace");
186
+ });
187
+ it("returns local info when local is running", async () => {
188
+ mockedIsLocalRunning.mockResolvedValue(true);
189
+ mockedGetLocalTokens.mockResolvedValue({
190
+ user_token: "local-user-token",
191
+ admin_token: "local-admin-token",
192
+ workspace_admin_token: "local-ws-admin-token",
193
+ });
194
+ mockedGetLocalWorkspaceName.mockReturnValue("local_workspace");
195
+ mockedGetOrCreateLocalWorkspace.mockResolvedValue({
196
+ workspace: {
197
+ id: "local-ws-123",
198
+ name: "local_workspace",
199
+ token: "local-token",
200
+ },
201
+ wasCreated: false,
202
+ });
203
+ mockedGetLocalDashboardUrl.mockReturnValue("https://cloud.tinybird.co/local/7181/local_workspace");
204
+ const result = await runInfo();
205
+ expect(result.success).toBe(true);
206
+ expect(result.local).toEqual({
207
+ running: true,
208
+ workspaceName: "local_workspace",
209
+ workspaceId: "local-ws-123",
210
+ apiHost: "http://localhost:7181",
211
+ dashboardUrl: "https://cloud.tinybird.co/local/7181/local_workspace",
212
+ token: "local-token",
213
+ });
214
+ });
215
+ it("returns local info with running=false when local is not running", async () => {
216
+ mockedIsLocalRunning.mockResolvedValue(false);
217
+ const result = await runInfo();
218
+ expect(result.success).toBe(true);
219
+ expect(result.local).toEqual({
220
+ running: false,
221
+ apiHost: "http://localhost:7181",
222
+ });
223
+ });
224
+ it("does not return branch info in local mode", async () => {
225
+ mockedIsLocalRunning.mockResolvedValue(false);
226
+ const result = await runInfo();
227
+ expect(result.success).toBe(true);
228
+ expect(result.branch).toBeUndefined();
229
+ expect(result.branches).toEqual([]);
230
+ expect(mockedGetBranch).not.toHaveBeenCalled();
231
+ expect(mockedListBranches).not.toHaveBeenCalled();
232
+ });
233
+ });
234
+ describe("error handling", () => {
235
+ it("returns error when workspace fetch fails", async () => {
236
+ mockedLoadConfig.mockReturnValue({
237
+ cwd: "/test",
238
+ configPath: "/test/tinybird.json",
239
+ devMode: "branch",
240
+ gitBranch: null,
241
+ tinybirdBranch: null,
242
+ isMainBranch: true,
243
+ baseUrl: "https://api.tinybird.co",
244
+ token: "test-token",
245
+ include: [],
246
+ });
247
+ mockedGetWorkspace.mockRejectedValue(new Error("Unauthorized"));
248
+ const result = await runInfo();
249
+ expect(result.success).toBe(false);
250
+ expect(result.error).toContain("Failed to get workspace info");
251
+ expect(result.error).toContain("Unauthorized");
252
+ });
253
+ it("handles branch fetch error gracefully", async () => {
254
+ mockedLoadConfig.mockReturnValue({
255
+ cwd: "/test",
256
+ configPath: "/test/tinybird.json",
257
+ devMode: "branch",
258
+ gitBranch: "feature/test",
259
+ tinybirdBranch: "feature_test",
260
+ isMainBranch: false,
261
+ baseUrl: "https://api.tinybird.co",
262
+ token: "test-token",
263
+ include: [],
264
+ });
265
+ mockedGetWorkspace.mockResolvedValue({
266
+ id: "ws-123",
267
+ name: "test-workspace",
268
+ user_email: "user@example.com",
269
+ user_id: "user-123",
270
+ scope: "WORKSPACE",
271
+ main: null,
272
+ });
273
+ mockedGetBranch.mockRejectedValue(new Error("Branch not found"));
274
+ mockedListBranches.mockResolvedValue([]);
275
+ mockedGetDashboardUrl.mockReturnValue(null);
276
+ const result = await runInfo();
277
+ expect(result.success).toBe(true);
278
+ expect(result.branch).toBeUndefined();
279
+ });
280
+ it("handles branches list fetch error gracefully", async () => {
281
+ mockedLoadConfig.mockReturnValue({
282
+ cwd: "/test",
283
+ configPath: "/test/tinybird.json",
284
+ devMode: "branch",
285
+ gitBranch: "main",
286
+ tinybirdBranch: null,
287
+ isMainBranch: true,
288
+ baseUrl: "https://api.tinybird.co",
289
+ token: "test-token",
290
+ include: [],
291
+ });
292
+ mockedGetWorkspace.mockResolvedValue({
293
+ id: "ws-123",
294
+ name: "test-workspace",
295
+ user_email: "user@example.com",
296
+ user_id: "user-123",
297
+ scope: "WORKSPACE",
298
+ main: null,
299
+ });
300
+ mockedListBranches.mockRejectedValue(new Error("Network error"));
301
+ mockedGetDashboardUrl.mockReturnValue(null);
302
+ const result = await runInfo();
303
+ expect(result.success).toBe(true);
304
+ expect(result.branches).toEqual([]);
305
+ });
306
+ it("handles local workspace fetch error gracefully", async () => {
307
+ mockedLoadConfig.mockReturnValue({
308
+ cwd: "/test",
309
+ configPath: "/test/tinybird.json",
310
+ devMode: "local",
311
+ gitBranch: "feature/test",
312
+ tinybirdBranch: "feature_test",
313
+ isMainBranch: false,
314
+ baseUrl: "https://api.tinybird.co",
315
+ token: "test-token",
316
+ include: [],
317
+ });
318
+ mockedGetWorkspace.mockResolvedValue({
319
+ id: "ws-123",
320
+ name: "test-workspace",
321
+ user_email: "user@example.com",
322
+ user_id: "user-123",
323
+ scope: "WORKSPACE",
324
+ main: null,
325
+ });
326
+ mockedIsLocalRunning.mockResolvedValue(true);
327
+ mockedGetLocalTokens.mockRejectedValue(new Error("Connection refused"));
328
+ mockedGetDashboardUrl.mockReturnValue(null);
329
+ const result = await runInfo();
330
+ expect(result.success).toBe(true);
331
+ expect(result.local).toEqual({
332
+ running: true,
333
+ apiHost: "http://localhost:7181",
334
+ });
335
+ });
336
+ });
337
+ });
338
+ //# sourceMappingURL=info.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.test.js","sourceRoot":"","sources":["../../../src/cli/commands/info.test.ts"],"names":[],"mappings":"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"}