filecoin-pin
Version:
Bridge IPFS content to Filecoin Onchain Cloud using familiar tools
223 lines (187 loc) • 6.69 kB
text/typescript
/**
* Tests for dataset management in multi-tenant scenarios
*/
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { createConfig } from '../../config.js'
import {
createStorageContext,
initializeSynapse,
resetSynapseService,
type SynapseSetupConfig,
setupSynapse,
} from '../../core/synapse/index.js'
import { createLogger } from '../../logger.js'
// Mock the Synapse SDK
vi.mock('@filoz/synapse-sdk', async () => await import('../mocks/synapse-sdk.js'))
describe('Dataset Management', () => {
let config: SynapseSetupConfig
let logger: ReturnType<typeof createLogger>
beforeEach(() => {
config = {
...createConfig(),
privateKey: '0x0000000000000000000000000000000000000000000000000000000000000001',
rpcUrl: 'wss://wss.calibration.node.glif.io/apigw/lotus/rpc/v1',
}
logger = createLogger({ logLevel: 'info' })
resetSynapseService()
vi.clearAllMocks()
})
afterEach(() => {
vi.clearAllMocks()
})
describe('Default behavior (reuse dataset)', () => {
it('should reuse existing dataset by default', async () => {
const service = await setupSynapse(config, logger)
expect(service.storage).toBeDefined()
expect(service.storage.dataSetId).toBeDefined()
})
it('should not force create dataset without explicit option', async () => {
const synapse = await initializeSynapse(config, logger)
const createContextSpy = vi.spyOn(synapse.storage, 'createContext')
await createStorageContext(synapse, { logger })
// Should NOT have forceCreateDataSet or dataSetId set
const callArgs = createContextSpy.mock.calls[0]?.[0]
expect(callArgs).toBeDefined()
expect(callArgs?.forceCreateDataSet).toBeUndefined()
expect(callArgs?.dataSetId).toBeUndefined()
})
})
describe('Create new dataset (multi-user scenario)', () => {
it('should force create new dataset when createNew is true', async () => {
const synapse = await initializeSynapse(config, logger)
const createContextSpy = vi.spyOn(synapse.storage, 'createContext')
await createStorageContext(synapse, {
logger,
dataset: { createNew: true },
})
expect(createContextSpy).toHaveBeenCalledWith(
expect.objectContaining({
forceCreateDataSet: true,
})
)
})
it('should create new dataset via setupSynapse', async () => {
const service = await setupSynapse(config, logger, {
dataset: { createNew: true },
})
expect(service.storage).toBeDefined()
expect(service.storage.dataSetId).toBeDefined()
})
it('should log dataset creation', async () => {
const infoSpy = vi.spyOn(logger, 'info')
const synapse = await initializeSynapse(config, logger)
await createStorageContext(synapse, {
logger,
dataset: { createNew: true },
})
expect(infoSpy).toHaveBeenCalledWith(
expect.objectContaining({
event: 'synapse.storage.dataset.create_new',
}),
'Forcing creation of new dataset'
)
})
it('should support custom metadata for new datasets', async () => {
const synapse = await initializeSynapse(config, logger)
const createContextSpy = vi.spyOn(synapse.storage, 'createContext')
await createStorageContext(synapse, {
logger,
dataset: {
createNew: true,
metadata: {
userId: 'user-123',
sessionId: 'session-456',
},
},
})
expect(createContextSpy).toHaveBeenCalledWith(
expect.objectContaining({
metadata: expect.objectContaining({
userId: 'user-123',
sessionId: 'session-456',
}),
})
)
})
})
describe('Connect to existing dataset', () => {
it('should connect to specific dataset by ID', async () => {
const synapse = await initializeSynapse(config, logger)
const createContextSpy = vi.spyOn(synapse.storage, 'createContext')
const datasetId = 456
await createStorageContext(synapse, {
logger,
dataset: { useExisting: datasetId },
})
expect(createContextSpy).toHaveBeenCalledWith(
expect.objectContaining({
dataSetId: datasetId,
})
)
})
it('should log connection to existing dataset', async () => {
const infoSpy = vi.spyOn(logger, 'info')
const synapse = await initializeSynapse(config, logger)
const datasetId = 789
await createStorageContext(synapse, {
logger,
dataset: { useExisting: datasetId },
})
expect(infoSpy).toHaveBeenCalledWith(
expect.objectContaining({
event: 'synapse.storage.dataset.existing',
dataSetId: datasetId,
}),
'Connecting to existing dataset'
)
})
it('useExisting should take precedence over createNew', async () => {
const synapse = await initializeSynapse(config, logger)
const createContextSpy = vi.spyOn(synapse.storage, 'createContext')
const datasetId = 999
await createStorageContext(synapse, {
logger,
dataset: {
useExisting: datasetId,
createNew: true, // This should be ignored
},
})
// Should have dataSetId set but NOT forceCreateDataSet
const callArgs = createContextSpy.mock.calls[0]?.[0]
expect(callArgs).toBeDefined()
expect(callArgs?.dataSetId).toBe(datasetId)
expect(callArgs?.forceCreateDataSet).toBeUndefined()
})
})
describe('Progress callbacks', () => {
it('should call onDataSetResolved callback', async () => {
const onDataSetResolved = vi.fn()
const synapse = await initializeSynapse(config, logger)
await createStorageContext(synapse, {
logger,
callbacks: { onDataSetResolved },
})
// Mock SDK fires this callback, our wrapper should pass it through
expect(onDataSetResolved).toHaveBeenCalledWith(
expect.objectContaining({
dataSetId: expect.any(Number),
isExisting: expect.any(Boolean),
})
)
})
it('should call onProviderSelected callback', async () => {
const onProviderSelected = vi.fn()
const synapse = await initializeSynapse(config, logger)
await createStorageContext(synapse, {
logger,
callbacks: { onProviderSelected },
})
expect(onProviderSelected).toHaveBeenCalledWith(
expect.objectContaining({
id: expect.any(Number),
serviceProvider: expect.any(String),
})
)
})
})
})