Files
AFFiNE/packages/backend/server/src/__tests__/create-module.ts
DarkSky 8ebdb7452f feat(server): impl storage runtime (#15181)
#### PR Dependency Tree


* **PR #15181** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added an additional storage backend option: asset-pack based storage
(provider for avatar, blob, and copilot).
* Introduced a dedicated storage runtime with provider capability
reporting and expanded object operations (put/head/get/list/delete),
including presigned and multipart flows where supported.
* Cloudflare R2 `jurisdiction` now uses an explicit default when
omitted.
* **Bug Fixes**
  * Broadened avatar access to allow both fs and asset-pack providers.
* Improved workspace blob upload completion validation and handling when
stored objects are missing or mismatched.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-01 22:24:10 +08:00

76 lines
2.0 KiB
TypeScript

import { ModuleMetadata } from '@nestjs/common';
import {
Test,
TestingModule as NestjsTestingModule,
TestingModuleBuilder,
} from '@nestjs/testing';
import { PrismaClient } from '@prisma/client';
import { FunctionalityModules } from '../app.module';
import { AFFiNELogger, EventBus, JobModule, JobQueue } from '../base';
import {
createFactory,
MockEventBus,
MockJobModule,
MockJobQueue,
} from './mocks';
import { TEST_LOG_LEVEL } from './utils';
interface TestingModuleMetadata extends ModuleMetadata {
tapModule?(m: TestingModuleBuilder): void;
}
export interface TestingModule extends NestjsTestingModule {
[Symbol.asyncDispose](): Promise<void>;
create: ReturnType<typeof createFactory>;
queue: MockJobQueue;
event: MockEventBus;
}
export async function createModule(
metadata: TestingModuleMetadata = {}
): Promise<TestingModule> {
const { tapModule, ...meta } = metadata;
const functionalityModules = [
...FunctionalityModules.filter(module => {
const moduleType = 'module' in module ? module.module : module;
return moduleType !== JobModule;
}),
MockJobModule,
];
const builder = Test.createTestingModule({
...meta,
imports: [...functionalityModules, ...(meta.imports ?? [])],
});
builder
.overrideProvider(JobQueue)
.useValue(new MockJobQueue())
.overrideProvider(EventBus)
.useValue(new MockEventBus());
// when custom override happens
if (tapModule) {
tapModule(builder);
}
const module = (await builder.compile()) as TestingModule;
const logger = new AFFiNELogger();
// we got a lot smoking tests try to break nestjs
// can't tolerate the noisy logs
logger.setLogLevels([TEST_LOG_LEVEL]);
module.useLogger(logger);
await module.init();
module[Symbol.asyncDispose] = async () => {
await module.close();
};
module.create = createFactory(module.get(PrismaClient));
module.queue = module.get(JobQueue);
module.event = module.get(EventBus);
return module;
}