Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 15 additions & 20 deletions apps/sim/app/api/table/[tableId]/delete-async/route.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
/**
* @vitest-environment node
*/
import { hybridAuthMockFns, resetEnvFlagsMock, setEnvFlags } from '@sim/testing'
import {
createTableDefinition,
hybridAuthMockFns,
resetEnvFlagsMock,
setEnvFlags,
type TableDefinitionFactoryOptions,
} from '@sim/testing'
import { NextRequest, NextResponse } from 'next/server'
import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest'
import type { TableDefinition } from '@/lib/table'

const {
mockCheckAccess,
Expand Down Expand Up @@ -58,22 +63,9 @@ import { POST } from '@/app/api/table/[tableId]/delete-async/route'

afterAll(resetEnvFlagsMock)

function buildTable(overrides: Partial<TableDefinition> = {}): TableDefinition {
return {
id: 'tbl_1',
name: 'People',
description: null,
schema: { columns: [{ name: 'status', type: 'string' }] },
metadata: null,
rowCount: 1000,
maxRows: 1_000_000,
workspaceId: 'workspace-1',
createdBy: 'user-1',
archivedAt: null,
createdAt: new Date(),
updatedAt: new Date(),
...overrides,
}
const TABLE_FIXTURE: TableDefinitionFactoryOptions = {
columns: [{ name: 'status', type: 'string' }],
rowCount: 1000,
}

function makeRequest(body: unknown, tableId = 'tbl_1') {
Expand All @@ -99,7 +91,7 @@ describe('POST /api/table/[tableId]/delete-async', () => {
userId: 'user-1',
authType: 'session',
})
mockCheckAccess.mockResolvedValue({ ok: true, table: buildTable() })
mockCheckAccess.mockResolvedValue({ ok: true, table: createTableDefinition(TABLE_FIXTURE) })
mockMarkTableJobRunning.mockResolvedValue(true)
mockRunTableDelete.mockResolvedValue(undefined)
mockTableFilterError.mockReturnValue(null)
Expand Down Expand Up @@ -168,7 +160,10 @@ describe('POST /api/table/[tableId]/delete-async', () => {
})

it('returns 400 when the table is archived', async () => {
mockCheckAccess.mockResolvedValue({ ok: true, table: buildTable({ archivedAt: new Date() }) })
mockCheckAccess.mockResolvedValue({
ok: true,
table: createTableDefinition({ ...TABLE_FIXTURE, archivedAt: new Date() }),
})
const response = await makeRequest(validBody)
expect(response.status).toBe(400)
expect(mockRunTableDelete).not.toHaveBeenCalled()
Expand Down
23 changes: 2 additions & 21 deletions apps/sim/app/api/table/[tableId]/dispatches/route.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
/**
* @vitest-environment node
*/
import { hybridAuthMockFns } from '@sim/testing'
import { createTableDefinition, hybridAuthMockFns } from '@sim/testing'
import { NextRequest } from 'next/server'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { TableDefinition } from '@/lib/table'

const { mockCheckAccess, mockListActiveDispatches, mockCountRunningCells } = vi.hoisted(() => ({
mockCheckAccess: vi.fn(),
Expand All @@ -27,24 +26,6 @@ vi.mock('@/app/api/table/utils', async () => {

import { GET } from '@/app/api/table/[tableId]/dispatches/route'

function buildTable(overrides: Partial<TableDefinition> = {}): TableDefinition {
return {
id: 'tbl_1',
name: 'People',
description: null,
schema: { columns: [] },
metadata: null,
rowCount: 0,
maxRows: 1_000_000,
workspaceId: 'workspace-1',
createdBy: 'user-1',
archivedAt: null,
createdAt: new Date(),
updatedAt: new Date(),
...overrides,
}
}

function makeRequest(tableId = 'tbl_1') {
const req = new NextRequest(`http://localhost:3000/api/table/${tableId}/dispatches`)
return GET(req, { params: Promise.resolve({ tableId }) })
Expand Down Expand Up @@ -75,7 +56,7 @@ describe('GET /api/table/[tableId]/dispatches', () => {
userId: 'user-1',
authType: 'session',
})
mockCheckAccess.mockResolvedValue({ ok: true, table: buildTable() })
mockCheckAccess.mockResolvedValue({ ok: true, table: createTableDefinition() })
mockListActiveDispatches.mockResolvedValue([])
mockCountRunningCells.mockResolvedValue({ byRowId: {}, hasRunning: false })
})
Expand Down
29 changes: 8 additions & 21 deletions apps/sim/app/api/table/[tableId]/export-async/route.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
/**
* @vitest-environment node
*/
import { hybridAuthMockFns } from '@sim/testing'
import { createTableDefinition, hybridAuthMockFns } from '@sim/testing'
import { NextRequest } from 'next/server'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { TableDefinition } from '@/lib/table'

const { mockCheckAccess, mockMarkTableJobRunning, mockRunTableExport } = vi.hoisted(() => ({
mockCheckAccess: vi.fn(),
Expand Down Expand Up @@ -34,24 +33,6 @@ vi.mock('@/app/api/table/utils', async () => {

import { POST } from '@/app/api/table/[tableId]/export-async/route'

function buildTable(overrides: Partial<TableDefinition> = {}): TableDefinition {
return {
id: 'tbl_1',
name: 'People',
description: null,
schema: { columns: [{ name: 'name', type: 'string' }] },
metadata: null,
rowCount: 50000,
maxRows: 1_000_000,
workspaceId: 'workspace-1',
createdBy: 'user-1',
archivedAt: null,
createdAt: new Date(),
updatedAt: new Date(),
...overrides,
}
}

function makeRequest(body: unknown, tableId = 'tbl_1') {
const req = new NextRequest(`http://localhost:3000/api/table/${tableId}/export-async`, {
method: 'POST',
Expand All @@ -71,7 +52,13 @@ describe('POST /api/table/[tableId]/export-async', () => {
userId: 'user-1',
authType: 'session',
})
mockCheckAccess.mockResolvedValue({ ok: true, table: buildTable() })
mockCheckAccess.mockResolvedValue({
ok: true,
table: createTableDefinition({
columns: [{ name: 'name', type: 'string' }],
rowCount: 50000,
}),
})
mockMarkTableJobRunning.mockResolvedValue(true)
mockRunTableExport.mockResolvedValue(undefined)
})
Expand Down
23 changes: 2 additions & 21 deletions apps/sim/app/api/table/[tableId]/export/download/route.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
/**
* @vitest-environment node
*/
import { hybridAuthMockFns } from '@sim/testing'
import { createTableDefinition, hybridAuthMockFns } from '@sim/testing'
import { NextRequest } from 'next/server'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { TableDefinition } from '@/lib/table'

const { mockCheckAccess, mockGetTableJob, mockGeneratePresignedDownloadUrl } = vi.hoisted(() => ({
mockCheckAccess: vi.fn(),
Expand All @@ -27,24 +26,6 @@ vi.mock('@/app/api/table/utils', async () => {

import { GET } from '@/app/api/table/[tableId]/export/download/route'

function buildTable(overrides: Partial<TableDefinition> = {}): TableDefinition {
return {
id: 'tbl_1',
name: 'People',
description: null,
schema: { columns: [] },
metadata: null,
rowCount: 0,
maxRows: 1_000_000,
workspaceId: 'workspace-1',
createdBy: 'user-1',
archivedAt: null,
createdAt: new Date(),
updatedAt: new Date(),
...overrides,
}
}

function makeRequest(query: Record<string, string>, tableId = 'tbl_1') {
const qs = new URLSearchParams(query).toString()
const req = new NextRequest(`http://localhost:3000/api/table/${tableId}/export/download?${qs}`)
Expand All @@ -61,7 +42,7 @@ describe('GET /api/table/[tableId]/export/download', () => {
userId: 'user-1',
authType: 'session',
})
mockCheckAccess.mockResolvedValue({ ok: true, table: buildTable() })
mockCheckAccess.mockResolvedValue({ ok: true, table: createTableDefinition() })
mockGetTableJob.mockResolvedValue({
id: 'job_1',
type: 'export',
Expand Down
38 changes: 14 additions & 24 deletions apps/sim/app/api/table/[tableId]/export/route.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
/**
* @vitest-environment node
*/
import { hybridAuthMockFns } from '@sim/testing'
import { createTableDefinition, hybridAuthMockFns } from '@sim/testing'
import { NextRequest } from 'next/server'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { TableDefinition } from '@/lib/table'

const { mockCheckAccess, mockQueryRows } = vi.hoisted(() => ({
mockCheckAccess: vi.fn(),
Expand All @@ -27,27 +26,6 @@ vi.mock('@/lib/table/rows/service', () => ({
import { GET } from '@/app/api/table/[tableId]/export/route'

/** Table with an id-native column whose stable id (`col_email`) differs from its display name. */
function buildTable(): TableDefinition {
return {
id: 'tbl_1',
name: 'People',
description: null,
schema: {
columns: [
{ id: 'col_email', name: 'email', type: 'string' },
{ name: 'legacy', type: 'string' }, // legacy: id == name
],
},
metadata: null,
rowCount: 1,
maxRows: 100,
workspaceId: 'workspace-1',
createdBy: 'user-1',
archivedAt: null,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-01'),
}
}

function callGet(format: string) {
const req = new NextRequest(`http://localhost:3000/api/table/tbl_1/export?format=${format}`, {
Expand All @@ -64,7 +42,19 @@ describe('table export route — id→name translation', () => {
userId: 'user-1',
authType: 'session',
})
mockCheckAccess.mockResolvedValue({ ok: true, table: buildTable() })
mockCheckAccess.mockResolvedValue({
ok: true,
table: createTableDefinition({
columns: [
{ id: 'col_email', name: 'email', type: 'string' },
{ name: 'legacy', type: 'string' }, // legacy: id == name
],
rowCount: 1,
maxRows: 100,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-01'),
}),
})
// Row data is keyed by stable column id (`col_email`), not the display name.
mockQueryRows.mockResolvedValue({
rows: [{ id: 'r1', data: { col_email: 'a@b.c', legacy: 'x' }, executions: {}, position: 0 }],
Expand Down
32 changes: 12 additions & 20 deletions apps/sim/app/api/table/[tableId]/import-async/route.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
/**
* @vitest-environment node
*/
import { hybridAuthMockFns } from '@sim/testing'
import {
createTableDefinition,
hybridAuthMockFns,
type TableDefinitionFactoryOptions,
} from '@sim/testing'
import { NextRequest } from 'next/server'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { TableDefinition } from '@/lib/table'

const { mockCheckAccess, mockMarkTableImporting, mockRunTableImport } = vi.hoisted(() => ({
mockCheckAccess: vi.fn(),
Expand Down Expand Up @@ -34,22 +37,8 @@ vi.mock('@/app/api/table/utils', async () => {

import { POST } from '@/app/api/table/[tableId]/import-async/route'

function buildTable(overrides: Partial<TableDefinition> = {}): TableDefinition {
return {
id: 'tbl_1',
name: 'People',
description: null,
schema: { columns: [{ name: 'name', type: 'string' }] },
metadata: null,
rowCount: 0,
maxRows: 1_000_000,
workspaceId: 'workspace-1',
createdBy: 'user-1',
archivedAt: null,
createdAt: new Date(),
updatedAt: new Date(),
...overrides,
}
const TABLE_FIXTURE: TableDefinitionFactoryOptions = {
columns: [{ name: 'name', type: 'string' }],
}

function makeRequest(body: unknown, tableId = 'tbl_1') {
Expand All @@ -76,7 +65,7 @@ describe('POST /api/table/[tableId]/import-async', () => {
userId: 'user-1',
authType: 'session',
})
mockCheckAccess.mockResolvedValue({ ok: true, table: buildTable() })
mockCheckAccess.mockResolvedValue({ ok: true, table: createTableDefinition(TABLE_FIXTURE) })
mockMarkTableImporting.mockResolvedValue(true)
mockRunTableImport.mockResolvedValue(undefined)
})
Expand Down Expand Up @@ -126,7 +115,10 @@ describe('POST /api/table/[tableId]/import-async', () => {
})

it('returns 400 when the target table is archived', async () => {
mockCheckAccess.mockResolvedValue({ ok: true, table: buildTable({ archivedAt: new Date() }) })
mockCheckAccess.mockResolvedValue({
ok: true,
table: createTableDefinition({ ...TABLE_FIXTURE, archivedAt: new Date() }),
})
const response = await makeRequest(validBody)
expect(response.status).toBe(400)
expect(mockRunTableImport).not.toHaveBeenCalled()
Expand Down
Loading
Loading