[Http] Prevent the internal HttpService being used in tests outside Core (#223238)

## Summary

Objective: avoid exposing the entire API surface area of `HttpService`
(and it's internal preboot/setup/start contracts) to test code outside
core.

* Refactor the `createHttpService -> createInternalHttpService` mock
test helper moved to scoped folder
`./src/core/server/integration_tests/utilities`
* Create an "integration test ready" version of the original
`createHttpService` for plugins to use from
`@kbn/core-http-server-mocks`
* Clean up some types
* Refactor the 2 plugin test usages of the internal `HttpService`

### Notes

* We have been exposing this surface area already in
`src/core/packages/http/server-mocks/src/http_service.mock.ts`. But it
seems to not have a adoption outside Core code... I wonder if we need a
concept of `mock-internal`?
* I don't think this is a **massive** issue, I just happened to realise
this when [messing
around](https://github.com/elastic/kibana/pull/222956) with an
`HttpService` related refactor. Would be nice to not leak more
information about internal code than necessary (it's clearly too late
for that, but maybe we can improve the situation for HttpService a bit).

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
Jean-Louis Leysens 2025-06-24 10:09:16 +02:00 committed by GitHub
parent 970cad1f18
commit 726908a913
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
63 changed files with 616 additions and 507 deletions

View file

@ -18,4 +18,13 @@ export type {
InternalHttpServiceSetupMock,
InternalHttpServiceStartMock,
} from './src/http_service.mock';
export { createCoreContext, createHttpService, createConfigService } from './src/test_utils';
export {
createCoreContext,
createHttpService,
createConfigService,
type HttpIntegrationTestService,
type HttpIntegrationServicePrebootContractMock,
type HttpIntegrationServiceSetupContractMock,
type HttpIntegrationServiceStartContractMock,
type HttpIntegrationServiceStopContractMock,
} from './src/test_utils';

View file

@ -14,7 +14,10 @@ import { ByteSizeValue } from '@kbn/config-schema';
import { Env } from '@kbn/config';
import { getEnvOptions, configServiceMock } from '@kbn/config-mocks';
import type { CoreContext } from '@kbn/core-base-server-internal';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { loggingSystemMock } from '@kbn/core-logging-server-mocks';
import type { IRouter } from '@kbn/core-http-server';
import {
type HttpConfigType,
type ExternalUrlConfigType,
@ -125,21 +128,58 @@ export const createCoreContext = (overrides: Partial<CoreContext> = {}): CoreCon
});
/**
* Creates a concrete HttpService with a mocked context.
* A mock of the HttpService that can be used in tests.
*
* @remarks intended to mirror the pubilc HTTP contracts where possible to avoid
* drifting or leaking too many internal details of the actual HttpService.
*/
export const createHttpService = ({
buildNum,
...overrides
}: Partial<CoreContext & { buildNum: number }> = {}): HttpService => {
const ctx = createCoreContext(overrides);
if (buildNum !== undefined) {
ctx.env = {
...ctx.env,
packageInfo: {
...ctx.env.packageInfo,
buildNum,
},
};
}
return new HttpService(ctx);
export interface HttpIntegrationTestService {
preboot: () => Promise<void>;
setup: () => Promise<{ createRouter: (path: string) => IRouter<any>; server: { listener: any } }>;
start: () => Promise<void>;
stop: () => Promise<void>;
}
export type HttpIntegrationServicePrebootContractMock = Awaited<
ReturnType<HttpIntegrationTestService['preboot']>
>;
export type HttpIntegrationServiceSetupContractMock = Awaited<
ReturnType<HttpIntegrationTestService['setup']>
>;
export type HttpIntegrationServiceStartContractMock = Awaited<
ReturnType<HttpIntegrationTestService['start']>
>;
export type HttpIntegrationServiceStopContractMock = Awaited<
ReturnType<HttpIntegrationTestService['stop']>
>;
/**
* Creates an HTTP service instance for external services to test against.
* @public
*/
export const createHttpService = (): HttpIntegrationTestService => {
const ctx = createCoreContext();
const svc = new HttpService(ctx);
return {
preboot: async () => {
await svc.preboot({
context: contextServiceMock.createPrebootContract(),
});
},
setup: () => {
return svc.setup({
context: contextServiceMock.createSetupContract(),
executionContext: executionContextServiceMock.createInternalSetupContract(),
});
},
start: async () => {
await svc.start();
},
stop: async () => {
await svc.stop();
},
};
};

View file

@ -22,6 +22,8 @@
"@kbn/repo-info",
"@kbn/config",
"@kbn/core-base-server-internal",
"@kbn/core-http-context-server-mocks",
"@kbn/core-execution-context-server-mocks",
],
"exclude": [
"target/**/*",

View file

@ -7,6 +7,6 @@
* License v3.0 only", or the "Server Side Public License, v 1".
*/
export { setupServer } from './src/setup_server';
export { setupServer, type SetupServerReturn } from './src/setup_server';
export { createExportableType } from './src/create_exportable_type';
export { createHiddenTypeVariants } from './src/create_hidden_type_variants';

View file

@ -9,7 +9,8 @@
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { ContextService } from '@kbn/core-http-context-server-internal';
import { createHttpService, createCoreContext } from '@kbn/core-http-server-mocks';
import { HttpService } from '@kbn/core-http-server-internal';
import { createCoreContext } from '@kbn/core-http-server-mocks';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks';
import { typeRegistryMock } from '@kbn/core-saved-objects-base-server-mocks';
@ -43,8 +44,7 @@ function createCoreServerRequestHandlerContextMock() {
export const setupServer = async (coreId: symbol = defaultCoreId) => {
const coreContext = createCoreContext({ coreId });
const contextService = new ContextService(coreContext);
const server = createHttpService(coreContext);
const server = new HttpService(coreContext);
await server.preboot({ context: contextServiceMock.createPrebootContract() });
const httpSetup = await server.setup({
context: contextService.setup({ pluginDependencies: new Map() }),
@ -57,8 +57,19 @@ export const setupServer = async (coreId: symbol = defaultCoreId) => {
});
return {
server,
httpSetup,
server: {
listener: httpSetup.server.listener,
start: async () => {
await server.start();
},
stop: async () => {
await server.stop();
},
},
createRouter: httpSetup.createRouter.bind(httpSetup),
registerRouteHandlerContext: httpSetup.registerRouteHandlerContext.bind(httpSetup),
handlerContext,
};
};
export type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;

View file

@ -21,7 +21,8 @@
"@kbn/core-saved-objects-base-server-mocks",
"@kbn/core-saved-objects-server",
"@kbn/core-saved-objects-server-mocks",
"@kbn/core-ui-settings-server-mocks"
"@kbn/core-ui-settings-server-mocks",
"@kbn/core-http-server-internal"
],
"exclude": [
"target/**/*",

View file

@ -14,14 +14,14 @@ import { getEnvOptions } from '@kbn/config-mocks';
import { loggingSystemMock } from '@kbn/core-logging-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import type { CapabilitiesSetup } from '@kbn/core-capabilities-server';
import { CapabilitiesService } from '@kbn/core-capabilities-server-internal';
import {
HttpService,
InternalHttpServicePreboot,
InternalHttpServiceSetup,
} from '@kbn/core-http-server-internal';
import { createHttpService } from '@kbn/core-http-server-mocks';
import type { CapabilitiesSetup } from '@kbn/core-capabilities-server';
import { CapabilitiesService } from '@kbn/core-capabilities-server-internal';
import { createInternalHttpService } from '../utilities';
const coreId = Symbol('core');
@ -36,7 +36,7 @@ describe('CapabilitiesService', () => {
let serviceSetup: CapabilitiesSetup;
beforeEach(async () => {
server = createHttpService();
server = createInternalHttpService();
httpPreboot = await server.preboot({ context: contextServiceMock.createPrebootContract() });
httpSetup = await server.setup({
context: contextServiceMock.createSetupContract(),

View file

@ -14,9 +14,9 @@ import { loggingSystemMock } from '@kbn/core-logging-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import type { IRouter } from '@kbn/core-http-server';
import { HttpService } from '@kbn/core-http-server-internal';
import { createHttpService } from '@kbn/core-http-server-mocks';
import { registerRouteForBundle, FileHashCache } from '@kbn/core-apps-server-internal';
import { HttpService } from '@kbn/core-http-server-internal';
import { createInternalHttpService } from '../utilities';
const buildHash = 'buildHash';
const fooPluginFixture = resolve(__dirname, './__fixtures__/plugin/foo');
@ -32,7 +32,7 @@ describe('bundle routes', () => {
logger = loggingSystemMock.create();
fileHashCache = new FileHashCache();
server = createHttpService({ logger });
server = createInternalHttpService({ logger });
await server.preboot({ context: contextServiceMock.createPrebootContract() });
});

View file

@ -15,10 +15,10 @@ import { executionContextServiceMock } from '@kbn/core-execution-context-server-
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import { ensureRawRequest } from '@kbn/core-http-router-server-internal';
import { HttpService } from '@kbn/core-http-server-internal';
import { createHttpService } from '@kbn/core-http-server-mocks';
import { Env } from '@kbn/config';
import { REPO_ROOT } from '@kbn/repo-info';
import { getEnvOptions } from '@kbn/config-mocks';
import { createInternalHttpService } from '../utilities';
let server: HttpService;
@ -35,7 +35,7 @@ const kibanaVersion = Env.createDefault(REPO_ROOT, getEnvOptions()).packageInfo.
beforeEach(async () => {
logger = loggingSystemMock.create();
server = createHttpService({ logger });
server = createInternalHttpService({ logger });
await server.preboot({ context: contextServiceMock.createPrebootContract() });
});

View file

@ -11,7 +11,7 @@ import supertest from 'supertest';
import { kibanaPackageJson } from '@kbn/repo-info';
import type { IRouter, RouteRegistrar } from '@kbn/core-http-server';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import { createConfigService, createHttpService } from '@kbn/core-http-server-mocks';
import { createConfigService } from '@kbn/core-http-server-mocks';
import { HttpService, HttpServerSetup } from '@kbn/core-http-server-internal';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { schema } from '@kbn/config-schema';
@ -19,6 +19,7 @@ import { IConfigServiceMock } from '@kbn/config-mocks';
import { Logger } from '@kbn/logging';
import { loggerMock } from '@kbn/logging-mocks';
import { KIBANA_BUILD_NR_HEADER } from '@kbn/core-http-common';
import { createInternalHttpService } from '../utilities';
const actualVersion = kibanaPackageJson.version;
const versionHeader = 'kbn-version';
@ -63,7 +64,7 @@ describe('core lifecycle handlers', () => {
beforeEach(async () => {
const configService = createConfigService(testConfig);
logger = loggerMock.create();
server = createHttpService({ configService, logger });
server = createInternalHttpService({ configService, logger });
await server.preboot({ context: contextServiceMock.createPrebootContract() });
const serverSetup = await server.setup(setupDeps);
router = serverSetup.createRouter('/');
@ -270,7 +271,7 @@ describe('core lifecycle handlers', () => {
restrictInternalApis: true,
},
});
server = createHttpService({ configService });
server = createInternalHttpService({ configService });
await server.preboot({ context: contextServiceMock.createPrebootContract() });
const serverSetup = await server.setup(setupDeps);
router = serverSetup.createRouter('/');
@ -348,7 +349,7 @@ describe('core lifecycle handlers with restrict internal routes enforced', () =>
beforeEach(async () => {
logger = loggerMock.create();
const configService = createConfigService({ server: { restrictInternalApis: true } });
server = createHttpService({ configService, logger });
server = createInternalHttpService({ configService, logger });
await server.preboot({ context: contextServiceMock.createPrebootContract() });
const serverSetup = await server.setup(setupDeps);
@ -427,7 +428,7 @@ describe('core lifecycle handlers with no strict client version check', () => {
},
},
});
server = createHttpService({ configService, logger, buildNum: 1234 });
server = createInternalHttpService({ configService, logger, buildNum: 1234 });
await server.preboot({ context: contextServiceMock.createPrebootContract() });
const serverSetup = await server.setup(setupDeps);
router = serverSetup.createRouter('/');

View file

@ -10,7 +10,7 @@
import supertest from 'supertest';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import { createConfigService, createHttpService } from '@kbn/core-http-server-mocks';
import { createConfigService } from '@kbn/core-http-server-mocks';
import type {
InternalContextPreboot,
InternalContextSetup,
@ -18,6 +18,7 @@ import type {
import { InternalExecutionContextSetup } from '@kbn/core-execution-context-server-internal';
import { IRouter } from '@kbn/core-http-server';
import { schema } from '@kbn/config-schema';
import { createInternalHttpService } from '../utilities';
let prebootDeps: {
context: jest.Mocked<InternalContextPreboot>;
@ -37,7 +38,7 @@ beforeEach(async () => {
};
});
let httpService: ReturnType<typeof createHttpService>;
let httpService: ReturnType<typeof createInternalHttpService>;
type ConfigServiceArgs = Parameters<typeof createConfigService>[0];
async function startService(
args: {
@ -45,7 +46,7 @@ async function startService(
createRoutes?: (getRouter: (pluginId?: symbol) => IRouter) => void;
} = {}
) {
httpService = createHttpService({
httpService = createInternalHttpService({
configService: createConfigService(args.config),
});
await httpService.preboot(prebootDeps);

View file

@ -12,8 +12,8 @@ import supertest from 'supertest';
import { loggingSystemMock } from '@kbn/core-logging-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import { createHttpService } from '@kbn/core-http-server-mocks';
import { HttpService } from '@kbn/core-http-server-internal';
import { createInternalHttpService } from '../utilities';
let server: HttpService;
const prebootDeps = {
@ -25,7 +25,7 @@ const setupDeps = {
};
beforeEach(async () => {
server = createHttpService({ logger: loggingSystemMock.create() });
server = createInternalHttpService({ logger: loggingSystemMock.create() });
});
afterEach(async () => {

View file

@ -15,9 +15,9 @@ import supertest from 'supertest';
import { loggingSystemMock } from '@kbn/core-logging-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import type { HttpService } from '@kbn/core-http-server-internal';
import { createHttpService } from '@kbn/core-http-server-mocks';
import { schema } from '@kbn/config-schema';
import { HttpService } from '@kbn/core-http-server-internal';
import { createInternalHttpService } from '../utilities';
let server: HttpService;
@ -32,7 +32,7 @@ const setupDeps = {
beforeEach(async () => {
logger = loggingSystemMock.create();
server = createHttpService({ logger });
server = createInternalHttpService({ logger });
await server.preboot({ context: contextServiceMock.createPrebootContract() });
});

View file

@ -15,10 +15,10 @@ import supertest from 'supertest';
import { loggingSystemMock } from '@kbn/core-logging-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import type { HttpService } from '@kbn/core-http-server-internal';
import { ensureRawRequest } from '@kbn/core-http-router-server-internal';
import { createHttpService } from '@kbn/core-http-server-mocks';
import { HttpService } from '@kbn/core-http-server-internal';
import { inspect } from 'util';
import { createInternalHttpService } from '../utilities';
let server: HttpService;
@ -33,7 +33,7 @@ const setupDeps = {
beforeEach(async () => {
logger = loggingSystemMock.create();
server = createHttpService({ logger });
server = createInternalHttpService({ logger });
await server.preboot({ context: contextServiceMock.createPrebootContract() });
});

View file

@ -19,10 +19,10 @@ import { loggingSystemMock } from '@kbn/core-logging-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import { Router } from '@kbn/core-http-router-server-internal';
import { createHttpService } from '@kbn/core-http-server-mocks';
import type { HttpService } from '@kbn/core-http-server-internal';
import { loggerMock } from '@kbn/logging-mocks';
import { createTestEnv, getEnvOptions } from '@kbn/config-mocks';
import { HttpService } from '@kbn/core-http-server-internal';
import { createInternalHttpService } from '../utilities';
const options = getEnvOptions();
options.cliArgs.dev = false;
@ -39,7 +39,7 @@ const setupDeps = {
beforeEach(async () => {
logger = loggingSystemMock.create();
server = createHttpService({ logger });
server = createInternalHttpService({ logger });
await server.preboot({ context: contextServiceMock.createPrebootContract() });
});

View file

@ -15,11 +15,12 @@ import { schema } from '@kbn/config-schema';
import { loggingSystemMock } from '@kbn/core-logging-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import { createHttpService, createConfigService } from '@kbn/core-http-server-mocks';
import { createConfigService } from '@kbn/core-http-server-mocks';
import type { HttpConfigType, HttpService } from '@kbn/core-http-server-internal';
import type { IRouter } from '@kbn/core-http-server';
import type { CliArgs } from '@kbn/config';
import { ELASTIC_HTTP_VERSION_QUERY_PARAM } from '@kbn/core-http-common';
import { createInternalHttpService } from '../utilities';
let server: HttpService;
let logger: ReturnType<typeof loggingSystemMock.create>;
@ -43,7 +44,7 @@ describe('Routing versioned requests', () => {
options.useVersionResolutionStrategyForInternalPaths ?? [],
},
};
server = createHttpService({
server = createInternalHttpService({
logger,
env: createTestEnv({ envOptions: getEnvOptions({ cliArgs }) }),
configService: createConfigService({

View file

@ -10,7 +10,6 @@
import supertest from 'supertest';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import { createHttpService } from '@kbn/core-http-server-mocks';
import { loggingSystemMock } from '@kbn/core-logging-browser-mocks';
import { Server } from '@hapi/hapi';
import { MetricsService } from '@kbn/core-metrics-server-internal';
@ -19,15 +18,16 @@ import { REPO_ROOT } from '@kbn/repo-info';
import { configServiceMock, getEnvOptions } from '@kbn/config-mocks';
import { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks';
import moment from 'moment';
import { createInternalHttpService } from '../utilities';
describe('GET /api/_elu_load', () => {
let logger: ReturnType<typeof loggingSystemMock.create>;
let server: ReturnType<typeof createHttpService>;
let server: ReturnType<typeof createInternalHttpService>;
let listener: Server['listener'];
let service: MetricsService;
beforeEach(async () => {
logger = loggingSystemMock.create();
server = createHttpService({ logger });
server = createInternalHttpService({ logger });
service = new MetricsService({
coreId: Symbol('core'),
env: Env.createDefault(REPO_ROOT, getEnvOptions()),

View file

@ -11,13 +11,13 @@ import { BehaviorSubject, Subject } from 'rxjs';
import { take, filter } from 'rxjs';
import supertest from 'supertest';
import { Server as HapiServer } from '@hapi/hapi';
import { createHttpService } from '@kbn/core-http-server-mocks';
import type { IRouter } from '@kbn/core-http-server';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import type { HttpService } from '@kbn/core-http-server-internal';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { ServerMetricsCollector } from '@kbn/core-metrics-collectors-server-internal';
import { setTimeout as setTimeoutPromise } from 'timers/promises';
import { createInternalHttpService } from '../utilities';
describe('ServerMetricsCollector', () => {
let server: HttpService;
@ -29,7 +29,7 @@ describe('ServerMetricsCollector', () => {
const sendGet = (path: string) => supertest(hapiServer.listener).get(path);
beforeEach(async () => {
server = createHttpService();
server = createInternalHttpService();
await server.preboot({ context: contextServiceMock.createPrebootContract() });
const contextSetup = contextServiceMock.createSetupContract();
const httpSetup = await server.setup({

View file

@ -14,14 +14,15 @@ import { getEnvOptions } from '@kbn/config-mocks';
import { loggingSystemMock } from '@kbn/core-logging-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import { createConfigService } from '@kbn/core-http-server-mocks';
import {
HttpService,
InternalHttpServicePreboot,
InternalHttpServiceSetup,
} from '@kbn/core-http-server-internal';
import { createConfigService, createHttpService } from '@kbn/core-http-server-mocks';
import { PricingService } from '@kbn/core-pricing-server-internal';
import type { PricingProductFeature, PricingProduct } from '@kbn/core-pricing-common';
import { createInternalHttpService } from '../utilities';
const coreId = Symbol('core');
@ -38,7 +39,7 @@ describe('PricingService', () => {
let serviceSetup: Awaited<ReturnType<PricingService['setup']>>;
beforeEach(async () => {
server = createHttpService();
server = createInternalHttpService();
httpPreboot = await server.preboot({ context: contextServiceMock.createPrebootContract() });
httpSetup = await server.setup({
context: contextServiceMock.createSetupContract(),

View file

@ -19,12 +19,14 @@ import {
registerBulkCreateRoute,
type InternalSavedObjectsRequestHandlerContext,
} from '@kbn/core-saved-objects-server-internal';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
createHiddenTypeVariants,
setupServer,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from '../routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'hidden-from-http', hide: false, hideFromHttpApis: true },
@ -32,13 +34,13 @@ const testTypes = [
describe('POST /api/saved_objects/_bulk_create with allowApiAccess true', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.client;
savedObjectsClient.bulkCreate.mockResolvedValue({ saved_objects: [] });
@ -48,8 +50,7 @@ describe('POST /api/saved_objects/_bulk_create with allowApiAccess true', () =>
.find((fullTest) => fullTest.name === typename);
});
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsBulkCreate.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -73,7 +74,7 @@ describe('POST /api/saved_objects/_bulk_create with allowApiAccess true', () =>
});
it('returns with status 200 when a type is hidden from the HTTP APIs', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_create?overwrite=true')
.send([
{
@ -92,7 +93,7 @@ describe('POST /api/saved_objects/_bulk_create with allowApiAccess true', () =>
migrationVersionCompatibility: 'compatible',
overwrite: true,
});
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/_bulk_create')
.send([
{

View file

@ -14,7 +14,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
createHiddenTypeVariants,
setupServer,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import {
registerBulkDeleteRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -22,8 +26,6 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from '../routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'hidden-from-http', hide: false, hideFromHttpApis: true },
@ -31,13 +33,13 @@ const testTypes = [
describe('POST /api/saved_objects/_bulk_delete with allowApiAccess as true', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.client;
savedObjectsClient.bulkDelete.mockResolvedValue({
@ -50,8 +52,7 @@ describe('POST /api/saved_objects/_bulk_delete with allowApiAccess as true', ()
.find((fullTest) => fullTest.name === typename);
});
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsBulkDelete.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -77,7 +78,7 @@ describe('POST /api/saved_objects/_bulk_delete with allowApiAccess as true', ()
});
it('returns with status 200 when a type is hidden from the HTTP APIs', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/_bulk_delete')
.send([
{

View file

@ -14,7 +14,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
createHiddenTypeVariants,
setupServer,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import {
registerBulkGetRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -22,8 +26,6 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from '../routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'hidden-from-http', hide: false, hideFromHttpApis: true },
@ -31,13 +33,13 @@ const testTypes = [
describe('POST /api/saved_objects/_bulk_get with allowApiAccess true', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.client;
savedObjectsClient.bulkGet.mockResolvedValue({
@ -49,8 +51,7 @@ describe('POST /api/saved_objects/_bulk_get with allowApiAccess true', () => {
.map((typeDesc) => createHiddenTypeVariants(typeDesc))
.find((fullTest) => fullTest.name === typename);
});
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsBulkGet.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -75,7 +76,7 @@ describe('POST /api/saved_objects/_bulk_get with allowApiAccess true', () => {
});
it('returns with status 200 when a type is hidden from the HTTP APIs', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/_bulk_get')
.send([
{

View file

@ -14,7 +14,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
SetupServerReturn,
createHiddenTypeVariants,
setupServer,
} from '@kbn/core-test-helpers-test-utils';
import {
registerBulkResolveRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -22,8 +26,6 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from '../routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'hidden-from-http', hide: false, hideFromHttpApis: true },
@ -31,13 +33,13 @@ const testTypes = [
describe('POST /api/saved_objects/_bulk_resolve with allowApiAccess true', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.client;
savedObjectsClient.bulkResolve.mockResolvedValue({
@ -50,8 +52,7 @@ describe('POST /api/saved_objects/_bulk_resolve with allowApiAccess true', () =>
.find((fullTest) => fullTest.name === typename);
});
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsBulkResolve.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -76,7 +77,7 @@ describe('POST /api/saved_objects/_bulk_resolve with allowApiAccess true', () =>
});
it('returns with status 200 when a type is hidden from the HTTP APIs', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_resolve')
.send([
{

View file

@ -13,7 +13,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
createHiddenTypeVariants,
setupServer,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import {
registerBulkUpdateRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -21,7 +25,6 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from '../routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'visualization', hide: false },
{ name: 'dashboard', hide: false },
@ -31,20 +34,19 @@ const testTypes = [
describe('PUT /api/saved_objects/_bulk_update with allowApiAccess true', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
handlerContext.savedObjects.typeRegistry.getType.mockImplementation((typename: string) => {
return testTypes
.map((typeDesc) => createHiddenTypeVariants(typeDesc))
.find((fullTest) => fullTest.name === typename);
});
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsBulkUpdate.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -69,7 +71,7 @@ describe('PUT /api/saved_objects/_bulk_update with allowApiAccess true', () => {
});
it('uses config option allowHttpApiAccess to grant hiddenFromHttpApis type access', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.put('/api/saved_objects/_bulk_update')
.send([
{

View file

@ -14,7 +14,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { setupServer, createHiddenTypeVariants } from '@kbn/core-test-helpers-test-utils';
import {
setupServer,
createHiddenTypeVariants,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import {
registerCreateRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -22,8 +26,6 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from '../routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'hidden-type', hide: true },
@ -31,7 +33,7 @@ const testTypes = [
];
describe('POST /api/saved_objects/{type} with allowApiAccess true', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
@ -46,12 +48,11 @@ describe('POST /api/saved_objects/{type} with allowApiAccess true', () => {
};
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.client;
savedObjectsClient.create.mockImplementation(() => Promise.resolve(clientResponse));
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsCreate.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -81,7 +82,7 @@ describe('POST /api/saved_objects/{type} with allowApiAccess true', () => {
});
it('returns with status 200 when a type is hidden from the HTTP APIs', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/hidden-from-http')
.send({
attributes: {

View file

@ -14,7 +14,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
createHiddenTypeVariants,
setupServer,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import {
registerDeleteRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -22,8 +26,6 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from '../routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'hidden-type', hide: true },
@ -32,13 +34,13 @@ const testTypes = [
describe('DELETE /api/saved_objects/{type}/{id} with allowApiAccess true', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.getClient();
handlerContext.savedObjects.getClient = jest.fn().mockImplementation(() => savedObjectsClient);
handlerContext.savedObjects.typeRegistry.getType.mockImplementation((typename: string) => {
@ -47,8 +49,7 @@ describe('DELETE /api/saved_objects/{type}/{id} with allowApiAccess true', () =>
.find((fullTest) => fullTest.name === typename);
});
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsDelete.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -72,14 +73,14 @@ describe('DELETE /api/saved_objects/{type}/{id} with allowApiAccess true', () =>
});
it('returns with status 400 if a type is hidden from the HTTP APIs', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.delete('/api/saved_objects/hidden-from-http/hiddenId')
.expect(200);
expect(result.body).toEqual({});
});
it('returns with status 400 if a type is hidden from the HTTP APIs with `force` option', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.delete('/api/saved_objects/hidden-from-http/hiddenId')
.query({ force: true })
.expect(200);

View file

@ -15,7 +15,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
createHiddenTypeVariants,
setupServer,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import { loggerMock } from '@kbn/logging-mocks';
import {
registerFindRoute,
@ -23,8 +27,6 @@ import {
} from '@kbn/core-saved-objects-server-internal';
import { deprecationMock, setupConfig } from '../routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'visualization', hide: false },
@ -36,7 +38,7 @@ const testTypes = [
];
describe('GET /api/saved_objects/_find with allowApiAccess true', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
@ -49,7 +51,7 @@ describe('GET /api/saved_objects/_find with allowApiAccess true', () => {
};
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
handlerContext.savedObjects.typeRegistry.getType.mockImplementation((typename: string) => {
return testTypes
@ -61,8 +63,7 @@ describe('GET /api/saved_objects/_find with allowApiAccess true', () => {
savedObjectsClient.find.mockResolvedValue(clientResponse);
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsFind.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -94,7 +95,7 @@ describe('GET /api/saved_objects/_find with allowApiAccess true', () => {
page: 0,
saved_objects: [],
};
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.get('/api/saved_objects/_find?type=hidden-from-http')
.expect(200);
@ -108,7 +109,7 @@ describe('GET /api/saved_objects/_find with allowApiAccess true', () => {
page: 0,
saved_objects: [],
};
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.get('/api/saved_objects/_find?type=hidden-type')
.expect(200);

View file

@ -10,7 +10,7 @@
import supertest from 'supertest';
import { ContextService } from '@kbn/core-http-context-server-internal';
import type { HttpService, InternalHttpServiceSetup } from '@kbn/core-http-server-internal';
import { createHttpService, createCoreContext } from '@kbn/core-http-server-mocks';
import { createCoreContext } from '@kbn/core-http-server-mocks';
import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal';
@ -18,13 +18,14 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { contextServiceMock, coreMock } from '../../../../mocks';
import {
registerGetRoute,
type InternalSavedObjectsRequestHandlerContext,
} from '@kbn/core-saved-objects-server-internal';
import { createHiddenTypeVariants } from '@kbn/core-test-helpers-test-utils';
import { loggerMock } from '@kbn/logging-mocks';
import { contextServiceMock, coreMock } from '../../../../mocks';
import { createInternalHttpService } from '../../../utilities';
import { deprecationMock, setupConfig } from '../routes_test_utils';
const coreId = Symbol('core');
@ -43,7 +44,7 @@ describe('GET /api/saved_objects/{type}/{id} with allowApiAccess true', () => {
beforeEach(async () => {
const coreContext = createCoreContext({ coreId });
server = createHttpService(coreContext);
server = createInternalHttpService(coreContext);
await server.preboot({ context: contextServiceMock.createPrebootContract() });
const contextService = new ContextService(coreContext);

View file

@ -10,7 +10,7 @@
import supertest from 'supertest';
import { ContextService } from '@kbn/core-http-context-server-internal';
import type { HttpService, InternalHttpServiceSetup } from '@kbn/core-http-server-internal';
import { createHttpService, createCoreContext } from '@kbn/core-http-server-mocks';
import { createCoreContext } from '@kbn/core-http-server-mocks';
import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks';
import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal';
import {
@ -18,13 +18,14 @@ import {
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { contextServiceMock, coreMock } from '../../../../mocks';
import {
registerResolveRoute,
type InternalSavedObjectsRequestHandlerContext,
} from '@kbn/core-saved-objects-server-internal';
import { createHiddenTypeVariants } from '@kbn/core-test-helpers-test-utils';
import { loggerMock } from '@kbn/logging-mocks';
import { contextServiceMock, coreMock } from '../../../../mocks';
import { createInternalHttpService } from '../../../utilities';
import { deprecationMock, setupConfig } from '../routes_test_utils';
const coreId = Symbol('core');
@ -44,7 +45,7 @@ describe('GET /api/saved_objects/resolve/{type}/{id} with allowApiAccess true',
beforeEach(async () => {
const coreContext = createCoreContext({ coreId });
server = createHttpService(coreContext);
server = createInternalHttpService(coreContext);
await server.preboot({ context: contextServiceMock.createPrebootContract() });
const contextService = new ContextService(coreContext);

View file

@ -14,7 +14,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
createHiddenTypeVariants,
setupServer,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import {
registerUpdateRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -22,8 +26,6 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from '../routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'hidden-type', hide: true },
@ -32,13 +34,13 @@ const testTypes = [
describe('PUT /api/saved_objects/{type}/{id?} with allowApiAccess true', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.client;
handlerContext.savedObjects.typeRegistry.getType.mockImplementation((typename: string) => {
@ -47,8 +49,7 @@ describe('PUT /api/saved_objects/{type}/{id?} with allowApiAccess true', () => {
.find((fullTest) => fullTest.name === typename);
});
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsUpdate.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -73,7 +74,7 @@ describe('PUT /api/saved_objects/{type}/{id?} with allowApiAccess true', () => {
});
it('returns with status 200 for types hidden from the HTTP APIs', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.put('/api/saved_objects/hidden-from-http/hiddenId')
.send({
attributes: { title: 'does not matter' },

View file

@ -19,12 +19,14 @@ import {
registerBulkCreateRoute,
type InternalSavedObjectsRequestHandlerContext,
} from '@kbn/core-saved-objects-server-internal';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
createHiddenTypeVariants,
setupServer,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from './routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'hidden-from-http', hide: false, hideFromHttpApis: true },
@ -32,7 +34,7 @@ const testTypes = [
describe('POST /api/saved_objects/_bulk_create', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
@ -40,7 +42,7 @@ describe('POST /api/saved_objects/_bulk_create', () => {
let registrationSpy: jest.SpyInstance;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.client;
savedObjectsClient.bulkCreate.mockResolvedValue({ saved_objects: [] });
@ -50,8 +52,7 @@ describe('POST /api/saved_objects/_bulk_create', () => {
.find((fullTest) => fullTest.name === typename);
});
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsBulkCreate.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -93,7 +94,7 @@ describe('POST /api/saved_objects/_bulk_create', () => {
};
savedObjectsClient.bulkCreate.mockResolvedValue(clientResponse);
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/_bulk_create')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -134,7 +135,7 @@ describe('POST /api/saved_objects/_bulk_create', () => {
},
];
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_create')
.set('x-elastic-internal-origin', 'kibana')
.send(docs)
@ -146,7 +147,7 @@ describe('POST /api/saved_objects/_bulk_create', () => {
});
it('passes along the overwrite option', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_create?overwrite=true')
.send([
{
@ -166,7 +167,7 @@ describe('POST /api/saved_objects/_bulk_create', () => {
});
it('returns with status 400 when a type is hidden from the HTTP APIs', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/_bulk_create')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -186,7 +187,7 @@ describe('POST /api/saved_objects/_bulk_create', () => {
});
it('logs a warning message when called', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_create')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -204,7 +205,7 @@ describe('POST /api/saved_objects/_bulk_create', () => {
});
it('passes deprecation config to the router arguments', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_create')
.set('x-elastic-internal-origin', 'kibana')
.send([

View file

@ -14,7 +14,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
createHiddenTypeVariants,
setupServer,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import {
registerBulkDeleteRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -22,8 +26,6 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from './routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'hidden-from-http', hide: false, hideFromHttpApis: true },
@ -31,7 +33,7 @@ const testTypes = [
describe('POST /api/saved_objects/_bulk_delete', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
@ -39,7 +41,7 @@ describe('POST /api/saved_objects/_bulk_delete', () => {
let registrationSpy: jest.SpyInstance;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.client;
savedObjectsClient.bulkDelete.mockResolvedValue({
@ -52,8 +54,7 @@ describe('POST /api/saved_objects/_bulk_delete', () => {
.find((fullTest) => fullTest.name === typename);
});
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsBulkDelete.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -92,7 +93,7 @@ describe('POST /api/saved_objects/_bulk_delete', () => {
};
savedObjectsClient.bulkDelete.mockImplementation(() => Promise.resolve(clientResponse));
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/_bulk_delete')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -118,7 +119,7 @@ describe('POST /api/saved_objects/_bulk_delete', () => {
},
];
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_delete')
.set('x-elastic-internal-origin', 'kibana')
.send(docs)
@ -130,7 +131,7 @@ describe('POST /api/saved_objects/_bulk_delete', () => {
});
it('returns with status 400 when a type is hidden from the HTTP APIs', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/_bulk_delete')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -144,7 +145,7 @@ describe('POST /api/saved_objects/_bulk_delete', () => {
});
it('returns with status 400 with `force` when a type is hidden from the HTTP APIs', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/_bulk_delete')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -159,7 +160,7 @@ describe('POST /api/saved_objects/_bulk_delete', () => {
});
it('logs a warning message when called', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_delete')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -173,7 +174,7 @@ describe('POST /api/saved_objects/_bulk_delete', () => {
});
it('passes deprecation configuration to the router arguments', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_delete')
.set('x-elastic-internal-origin', 'kibana')
.send([

View file

@ -14,7 +14,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
createHiddenTypeVariants,
setupServer,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import {
registerBulkGetRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -22,8 +26,6 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from './routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'hidden-from-http', hide: false, hideFromHttpApis: true },
@ -31,7 +33,7 @@ const testTypes = [
describe('POST /api/saved_objects/_bulk_get', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
@ -39,7 +41,7 @@ describe('POST /api/saved_objects/_bulk_get', () => {
let registrationSpy: jest.SpyInstance;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.client;
savedObjectsClient.bulkGet.mockResolvedValue({
@ -51,8 +53,7 @@ describe('POST /api/saved_objects/_bulk_get', () => {
.map((typeDesc) => createHiddenTypeVariants(typeDesc))
.find((fullTest) => fullTest.name === typename);
});
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsBulkGet.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -93,7 +94,7 @@ describe('POST /api/saved_objects/_bulk_get', () => {
};
savedObjectsClient.bulkGet.mockImplementation(() => Promise.resolve(clientResponse));
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/_bulk_get')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -119,7 +120,7 @@ describe('POST /api/saved_objects/_bulk_get', () => {
},
];
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_get')
.set('x-elastic-internal-origin', 'kibana')
.send(docs)
@ -132,7 +133,7 @@ describe('POST /api/saved_objects/_bulk_get', () => {
});
it('returns with status 400 when a type is hidden from the HTTP APIs', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/_bulk_get')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -146,7 +147,7 @@ describe('POST /api/saved_objects/_bulk_get', () => {
});
it('logs a warning message when called', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_get')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -160,7 +161,7 @@ describe('POST /api/saved_objects/_bulk_get', () => {
});
it('passes deprecation config to the router arguments', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_get')
.set('x-elastic-internal-origin', 'kibana')
.send([

View file

@ -14,7 +14,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
createHiddenTypeVariants,
setupServer,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import {
registerBulkResolveRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -22,8 +26,6 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from './routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'hidden-from-http', hide: false, hideFromHttpApis: true },
@ -31,7 +33,7 @@ const testTypes = [
describe('POST /api/saved_objects/_bulk_resolve', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
@ -39,7 +41,7 @@ describe('POST /api/saved_objects/_bulk_resolve', () => {
let registrationSpy: jest.SpyInstance;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.client;
savedObjectsClient.bulkResolve.mockResolvedValue({
@ -52,8 +54,7 @@ describe('POST /api/saved_objects/_bulk_resolve', () => {
.find((fullTest) => fullTest.name === typename);
});
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsBulkResolve.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -96,7 +97,7 @@ describe('POST /api/saved_objects/_bulk_resolve', () => {
};
savedObjectsClient.bulkResolve.mockImplementation(() => Promise.resolve(clientResponse));
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/_bulk_resolve')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -122,7 +123,7 @@ describe('POST /api/saved_objects/_bulk_resolve', () => {
},
];
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_resolve')
.set('x-elastic-internal-origin', 'kibana')
.send(docs)
@ -135,7 +136,7 @@ describe('POST /api/saved_objects/_bulk_resolve', () => {
});
it('returns with status 400 when a type is hidden from the HTTP APIs', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/_bulk_resolve')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -149,7 +150,7 @@ describe('POST /api/saved_objects/_bulk_resolve', () => {
});
it('logs a warning message when called', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_resolve')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -163,7 +164,7 @@ describe('POST /api/saved_objects/_bulk_resolve', () => {
});
it('passes deprecation configuration to the router arguments', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/_bulk_resolve')
.set('x-elastic-internal-origin', 'kibana')
.send([

View file

@ -14,7 +14,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
createHiddenTypeVariants,
setupServer,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import {
registerBulkUpdateRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -22,7 +26,6 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from './routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'visualization', hide: false },
{ name: 'dashboard', hide: false },
@ -32,7 +35,7 @@ const testTypes = [
describe('PUT /api/saved_objects/_bulk_update', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
@ -40,7 +43,7 @@ describe('PUT /api/saved_objects/_bulk_update', () => {
let registrationSpy: jest.SpyInstance;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.client;
@ -50,8 +53,7 @@ describe('PUT /api/saved_objects/_bulk_update', () => {
.find((fullTest) => fullTest.name === typename);
});
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsBulkUpdate.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -103,7 +105,7 @@ describe('PUT /api/saved_objects/_bulk_update', () => {
];
savedObjectsClient.bulkUpdate.mockResolvedValue({ saved_objects: clientResponse });
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.put('/api/saved_objects/_bulk_update')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -134,7 +136,7 @@ describe('PUT /api/saved_objects/_bulk_update', () => {
it('calls upon savedObjectClient.bulkUpdate', async () => {
savedObjectsClient.bulkUpdate.mockResolvedValue({ saved_objects: [] });
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.put('/api/saved_objects/_bulk_update')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -175,7 +177,7 @@ describe('PUT /api/saved_objects/_bulk_update', () => {
});
it('returns with status 400 when a type is hidden from the HTTP APIs', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.put('/api/saved_objects/_bulk_update')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -193,7 +195,7 @@ describe('PUT /api/saved_objects/_bulk_update', () => {
});
it('logs a warning message when called', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.put('/api/saved_objects/_bulk_update')
.set('x-elastic-internal-origin', 'kibana')
.send([
@ -220,7 +222,7 @@ describe('PUT /api/saved_objects/_bulk_update', () => {
});
it('passes deprecation configuration to the router arguments', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.put('/api/saved_objects/_bulk_update')
.set('x-elastic-internal-origin', 'kibana')
.send([

View file

@ -14,7 +14,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { setupServer, createHiddenTypeVariants } from '@kbn/core-test-helpers-test-utils';
import {
setupServer,
createHiddenTypeVariants,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import {
registerCreateRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -22,8 +26,6 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from './routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'hidden-type', hide: true },
@ -31,7 +33,7 @@ const testTypes = [
];
describe('POST /api/saved_objects/{type}', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
@ -48,12 +50,11 @@ describe('POST /api/saved_objects/{type}', () => {
};
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.client;
savedObjectsClient.create.mockImplementation(() => Promise.resolve(clientResponse));
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsCreate.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -86,7 +87,7 @@ describe('POST /api/saved_objects/{type}', () => {
});
it('formats successful response and records usage stats', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/index-pattern')
.set('x-elastic-internal-origin', 'kibana')
.send({
@ -104,7 +105,7 @@ describe('POST /api/saved_objects/{type}', () => {
});
it('requires attributes', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/index-pattern')
.set('x-elastic-internal-origin', 'kibana')
.send({})
@ -117,7 +118,7 @@ describe('POST /api/saved_objects/{type}', () => {
});
it('calls upon savedObjectClient.create', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/index-pattern')
.set('x-elastic-internal-origin', 'kibana')
.send({
@ -141,7 +142,7 @@ describe('POST /api/saved_objects/{type}', () => {
});
it('can specify an id', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/index-pattern/logstash-*')
.set('x-elastic-internal-origin', 'kibana')
.send({
@ -162,7 +163,7 @@ describe('POST /api/saved_objects/{type}', () => {
});
it('returns with status 400 if the type is hidden from the HTTP APIs', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/api/saved_objects/hidden-from-http')
.set('x-elastic-internal-origin', 'kibana')
.send({
@ -176,7 +177,7 @@ describe('POST /api/saved_objects/{type}', () => {
});
it('logs a warning message when called', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/index-pattern')
.set('x-elastic-internal-origin', 'kibana')
.send({
@ -189,7 +190,7 @@ describe('POST /api/saved_objects/{type}', () => {
});
it('passes deprecation configuration to the router arguments', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/saved_objects/index-pattern')
.set('x-elastic-internal-origin', 'kibana')
.send({

View file

@ -14,7 +14,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
SetupServerReturn,
createHiddenTypeVariants,
setupServer,
} from '@kbn/core-test-helpers-test-utils';
import {
registerDeleteRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -22,8 +26,6 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from './routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'hidden-type', hide: true },
@ -32,7 +34,7 @@ const testTypes = [
describe('DELETE /api/saved_objects/{type}/{id}', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
@ -40,7 +42,7 @@ describe('DELETE /api/saved_objects/{type}/{id}', () => {
let registrationSpy: jest.SpyInstance;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.getClient();
handlerContext.savedObjects.getClient = jest.fn().mockImplementation(() => savedObjectsClient);
handlerContext.savedObjects.typeRegistry.getType.mockImplementation((typename: string) => {
@ -49,8 +51,7 @@ describe('DELETE /api/saved_objects/{type}/{id}', () => {
.find((fullTest) => fullTest.name === typename);
});
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsDelete.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -76,7 +77,7 @@ describe('DELETE /api/saved_objects/{type}/{id}', () => {
});
it('formats successful response and records usage stats', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.delete('/api/saved_objects/index-pattern/logstash-*')
.expect(200);
@ -88,7 +89,7 @@ describe('DELETE /api/saved_objects/{type}/{id}', () => {
});
it('calls upon savedObjectClient.delete', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.delete('/api/saved_objects/index-pattern/logstash-*')
.expect(200);
@ -98,7 +99,7 @@ describe('DELETE /api/saved_objects/{type}/{id}', () => {
});
it('can specify `force` option', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.delete('/api/saved_objects/index-pattern/logstash-*')
.query({ force: true })
.expect(200);
@ -109,14 +110,14 @@ describe('DELETE /api/saved_objects/{type}/{id}', () => {
});
it('returns with status 400 if a type is hidden from the HTTP APIs', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.delete('/api/saved_objects/hidden-from-http/hiddenId')
.expect(400);
expect(result.body.message).toContain("Unsupported saved object type: 'hidden-from-http'");
});
it('returns with status 400 if a type is hidden from the HTTP APIs with `force` option', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.delete('/api/saved_objects/hidden-from-http/hiddenId')
.query({ force: true })
.expect(400);
@ -124,14 +125,14 @@ describe('DELETE /api/saved_objects/{type}/{id}', () => {
});
it('logs a warning message when called', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.delete('/api/saved_objects/index-pattern/logstash-*')
.expect(200);
expect(loggerWarnSpy).toHaveBeenCalledTimes(1);
});
it('passes deprecation configuration to the router arguments', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.delete('/api/saved_objects/index-pattern/logstash-*')
.expect(200);
expect(registrationSpy.mock.calls[0][0]).toMatchObject({

View file

@ -10,27 +10,25 @@
import supertest from 'supertest';
import { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks';
import { typeRegistryMock } from '@kbn/core-saved-objects-base-server-mocks';
import { setupServer } from '@kbn/core-test-helpers-test-utils';
import { SetupServerReturn, setupServer } from '@kbn/core-test-helpers-test-utils';
import { SavedObjectsType } from '../../..';
import {
registerDeleteUnknownTypesRoute,
type InternalSavedObjectsRequestHandlerContext,
} from '@kbn/core-saved-objects-server-internal';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
describe('POST /internal/saved_objects/deprecations/_delete_unknown_types', () => {
const kibanaVersion = '8.0.0';
const kibanaIndex = '.kibana';
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let typeRegistry: ReturnType<typeof typeRegistryMock.create>;
let elasticsearchClient: ReturnType<typeof elasticsearchServiceMock.createScopedClusterClient>;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
elasticsearchClient = elasticsearchServiceMock.createScopedClusterClient();
typeRegistry = typeRegistryMock.create();
@ -41,7 +39,7 @@ describe('POST /internal/saved_objects/deprecations/_delete_unknown_types', () =
handlerContext.elasticsearch.client.asCurrentUser = elasticsearchClient.asCurrentUser;
handlerContext.elasticsearch.client.asInternalUser = elasticsearchClient.asInternalUser;
const router = httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>(
const router = createRouter<InternalSavedObjectsRequestHandlerContext>(
'/internal/saved_objects/'
);
registerDeleteUnknownTypesRoute(router, {
@ -57,7 +55,7 @@ describe('POST /internal/saved_objects/deprecations/_delete_unknown_types', () =
});
it('formats successful response', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post('/internal/saved_objects/deprecations/_delete_unknown_types')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -66,7 +64,7 @@ describe('POST /internal/saved_objects/deprecations/_delete_unknown_types', () =
});
it('calls upon esClient.deleteByQuery', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/internal/saved_objects/deprecations/_delete_unknown_types')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);

View file

@ -16,13 +16,16 @@ import {
} from '@kbn/core-usage-data-server-mocks';
import { savedObjectsExporterMock } from '@kbn/core-saved-objects-import-export-server-mocks';
import type { SavedObjectConfig } from '@kbn/core-saved-objects-base-server-internal';
import { setupServer, createExportableType } from '@kbn/core-test-helpers-test-utils';
import {
setupServer,
createExportableType,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import {
registerExportRoute,
type InternalSavedObjectsRequestHandlerContext,
} from '@kbn/core-saved-objects-server-internal';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const allowedTypes = ['index-pattern', 'search'];
const config = {
maxImportPayloadBytes: 26214400,
@ -32,19 +35,18 @@ let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
describe('POST /api/saved_objects/_export', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let exporter: ReturnType<typeof savedObjectsExporterMock.create>;
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
handlerContext.savedObjects.typeRegistry.getImportableAndExportableTypes.mockReturnValue(
allowedTypes.map(createExportableType)
);
exporter = handlerContext.savedObjects.getExporter();
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
handlerContext.savedObjects.getExporter = jest
.fn()
.mockImplementation(() => exporter as ReturnType<typeof savedObjectsExporterMock.create>);
@ -86,13 +88,11 @@ describe('POST /api/saved_objects/_export', () => {
exporter.exportByTypes.mockResolvedValueOnce(createListStream(sortedObjects));
const result = await supertest(httpSetup.server.listener)
.post('/api/saved_objects/_export')
.send({
type: 'search',
search: 'my search string',
includeReferencesDeep: true,
});
const result = await supertest(server.listener).post('/api/saved_objects/_export').send({
type: 'search',
search: 'my search string',
includeReferencesDeep: true,
});
expect(result.status).toBe(200);
expect(result.header).toEqual(

View file

@ -16,7 +16,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
createHiddenTypeVariants,
setupServer,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import { loggerMock } from '@kbn/logging-mocks';
import {
registerFindRoute,
@ -24,8 +28,6 @@ import {
} from '@kbn/core-saved-objects-server-internal';
import { deprecationMock, setupConfig } from './routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false },
{ name: 'visualization', hide: false },
@ -37,7 +39,7 @@ const testTypes = [
];
describe('GET /api/saved_objects/_find', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
@ -52,7 +54,7 @@ describe('GET /api/saved_objects/_find', () => {
};
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
handlerContext.savedObjects.typeRegistry.getType.mockImplementation((typename: string) => {
return testTypes
@ -64,8 +66,7 @@ describe('GET /api/saved_objects/_find', () => {
savedObjectsClient.find.mockResolvedValue(clientResponse);
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsFind.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -93,7 +94,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('returns with status 400 when type is missing', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.get('/api/saved_objects/_find')
.set('x-elastic-internal-origin', 'kibana')
.expect(400);
@ -109,7 +110,7 @@ describe('GET /api/saved_objects/_find', () => {
message: 'Unsupported saved object type(s): hidden-from-http: Bad Request',
statusCode: 400,
};
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.get('/api/saved_objects/_find?type=hidden-from-http')
.set('x-elastic-internal-origin', 'kibana')
.expect(400);
@ -124,7 +125,7 @@ describe('GET /api/saved_objects/_find', () => {
page: 0,
saved_objects: [],
};
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.get('/api/saved_objects/_find?type=hidden-type')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -164,7 +165,7 @@ describe('GET /api/saved_objects/_find', () => {
};
savedObjectsClient.find.mockResolvedValue(findResponse);
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.get('/api/saved_objects/_find?type=index-pattern')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -177,7 +178,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('calls upon savedObjectClient.find with defaults', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get('/api/saved_objects/_find?type=foo&type=bar')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -197,7 +198,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('accepts the query parameter page/per_page', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get('/api/saved_objects/_find?type=foo&per_page=10&page=50')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -209,7 +210,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('accepts the optional query parameter has_reference', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get('/api/saved_objects/_find?type=foo')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -227,7 +228,7 @@ describe('GET /api/saved_objects/_find', () => {
type: 'reference',
})
);
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`/api/saved_objects/_find?type=foo&has_reference=${references}`)
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -254,7 +255,7 @@ describe('GET /api/saved_objects/_find', () => {
},
])
);
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`/api/saved_objects/_find?type=foo&has_reference=${references}`)
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -275,7 +276,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('accepts the query parameter has_reference_operator', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get('/api/saved_objects/_find?type=foo&has_reference_operator=AND')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -297,7 +298,7 @@ describe('GET /api/saved_objects/_find', () => {
type: 'reference',
})
);
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`/api/saved_objects/_find?type=foo&has_no_reference=${references}`)
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -324,7 +325,7 @@ describe('GET /api/saved_objects/_find', () => {
},
])
);
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`/api/saved_objects/_find?type=foo&has_no_reference=${references}`)
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -345,7 +346,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('accepts the query parameter has_no_reference_operator', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get('/api/saved_objects/_find?type=foo&has_no_reference_operator=AND')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -361,7 +362,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('accepts the query parameter search_fields', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get('/api/saved_objects/_find?type=foo&search_fields=title')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -377,7 +378,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('accepts the query parameter fields as a string', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get('/api/saved_objects/_find?type=foo&fields=title')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -393,7 +394,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('accepts the query parameter fields as an array', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get('/api/saved_objects/_find?type=foo&fields=title&fields=description')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -409,7 +410,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('accepts the query parameter type as a string', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get('/api/saved_objects/_find?type=index-pattern')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -425,7 +426,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('accepts the query parameter type as an array', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get('/api/saved_objects/_find?type=index-pattern&type=visualization')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -441,7 +442,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('accepts the query parameter namespaces as a string', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get('/api/saved_objects/_find?type=index-pattern&namespaces=foo')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -457,7 +458,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('accepts the query parameter namespaces as an array', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get('/api/saved_objects/_find?type=index-pattern&namespaces=default&namespaces=foo')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -473,7 +474,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('logs a warning message when called', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get('/api/saved_objects/_find?type=foo&type=bar')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);
@ -481,7 +482,7 @@ describe('GET /api/saved_objects/_find', () => {
});
it('passes deprecation configuration to the router arguments', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get('/api/saved_objects/_find?type=foo&type=bar')
.set('x-elastic-internal-origin', 'kibana')
.expect(200);

View file

@ -10,7 +10,7 @@
import supertest from 'supertest';
import { ContextService } from '@kbn/core-http-context-server-internal';
import type { HttpService, InternalHttpServiceSetup } from '@kbn/core-http-server-internal';
import { createHttpService, createCoreContext } from '@kbn/core-http-server-mocks';
import { createCoreContext } from '@kbn/core-http-server-mocks';
import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal';
@ -18,7 +18,6 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { contextServiceMock, coreMock } from '../../../mocks';
import {
registerGetRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -26,6 +25,8 @@ import {
import { createHiddenTypeVariants } from '@kbn/core-test-helpers-test-utils';
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from './routes_test_utils';
import { contextServiceMock, coreMock } from '../../../mocks';
import { createInternalHttpService } from '../../utilities';
const coreId = Symbol('core');
const testTypes = [
@ -45,7 +46,7 @@ describe('GET /api/saved_objects/{type}/{id}', () => {
beforeEach(async () => {
const coreContext = createCoreContext({ coreId });
server = createHttpService(coreContext);
server = createInternalHttpService(coreContext);
await server.preboot({ context: contextServiceMock.createPrebootContract() });
const contextService = new ContextService(coreContext);

View file

@ -26,11 +26,13 @@ import {
registerImportRoute,
type InternalSavedObjectsRequestHandlerContext,
} from '@kbn/core-saved-objects-server-internal';
import { setupServer, createExportableType } from '@kbn/core-test-helpers-test-utils';
import {
setupServer,
createExportableType,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import { loggerMock, type MockedLogger } from '@kbn/logging-mocks';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const allowedTypes = ['index-pattern', 'visualization', 'dashboard'];
const config = { maxImportPayloadBytes: 26214400, maxImportExportSize: 10000 } as SavedObjectConfig;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
@ -38,7 +40,7 @@ const URL = '/internal/saved_objects/_import';
describe(`POST ${URL}`, () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let mockLogger: MockedLogger;
@ -60,7 +62,7 @@ describe(`POST ${URL}`, () => {
};
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
mockLogger = loggerMock.create();
handlerContext.savedObjects.typeRegistry.getImportableAndExportableTypes.mockReturnValue(
allowedTypes.map(createExportableType)
@ -85,7 +87,7 @@ describe(`POST ${URL}`, () => {
.fn()
.mockImplementation(() => importer as jest.Mocked<SavedObjectsImporter>);
const router = httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>(
const router = createRouter<InternalSavedObjectsRequestHandlerContext>(
'/internal/saved_objects/'
);
coreUsageStatsClient = coreUsageStatsClientMock.create();
@ -101,7 +103,7 @@ describe(`POST ${URL}`, () => {
});
it('formats successful response and records usage stats', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(URL)
.set('content-Type', 'multipart/form-data; boundary=BOUNDARY')
.send(
@ -129,7 +131,7 @@ describe(`POST ${URL}`, () => {
it('defaults migrationVersion to empty object', async () => {
savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [mockIndexPattern] });
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(URL)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -167,7 +169,7 @@ describe(`POST ${URL}`, () => {
it('returns the default for managed as part of the successResults', async () => {
savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [mockIndexPattern] });
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(URL)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -209,7 +211,7 @@ describe(`POST ${URL}`, () => {
saved_objects: [mockIndexPattern, { ...mockDashboard, managed: false }],
});
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(URL)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -259,7 +261,7 @@ describe(`POST ${URL}`, () => {
errors: [{ type: mockIndexPattern.type, id: mockIndexPattern.id, error }],
});
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(URL)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -311,7 +313,7 @@ describe(`POST ${URL}`, () => {
saved_objects: [mockIndexPattern, mockDashboard],
});
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(`${URL}?overwrite=true`)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -361,7 +363,7 @@ describe(`POST ${URL}`, () => {
saved_objects: [{ ...mockIndexPattern, error }],
});
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(URL)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -425,7 +427,7 @@ describe(`POST ${URL}`, () => {
errors: [{ type: 'visualization', id: 'my-vis', error: error2 }],
});
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(URL)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -495,7 +497,7 @@ describe(`POST ${URL}`, () => {
errors: [{ type: 'visualization', id: 'my-vis', error: error2 }],
});
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(`${URL}?overwrite=true`)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -570,7 +572,7 @@ describe(`POST ${URL}`, () => {
};
savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [obj1, obj2] });
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(`${URL}?createNewCopies=true`)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -710,7 +712,7 @@ describe(`POST ${URL}`, () => {
saved_objects: [legacyUrlAliasObj2, legacyUrlAliasObj3],
});
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(`${URL}?compatibilityMode=true`)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -868,7 +870,7 @@ describe(`POST ${URL}`, () => {
};
savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [legacyUrlAliasObj1] });
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(`${URL}?compatibilityMode=true`)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -1001,7 +1003,7 @@ describe(`POST ${URL}`, () => {
],
});
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(`${URL}?compatibilityMode=true`)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(

View file

@ -10,7 +10,7 @@
import supertest from 'supertest';
import { ContextService } from '@kbn/core-http-context-server-internal';
import type { HttpService, InternalHttpServiceSetup } from '@kbn/core-http-server-internal';
import { createHttpService, createCoreContext } from '@kbn/core-http-server-mocks';
import { createCoreContext } from '@kbn/core-http-server-mocks';
import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks';
import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal';
import {
@ -18,7 +18,6 @@ import {
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { contextServiceMock, coreMock } from '../../../mocks';
import {
registerResolveRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -26,6 +25,8 @@ import {
import { createHiddenTypeVariants } from '@kbn/core-test-helpers-test-utils';
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from './routes_test_utils';
import { contextServiceMock, coreMock } from '../../../mocks';
import { createInternalHttpService } from '../../utilities';
const coreId = Symbol('core');
@ -46,7 +47,7 @@ describe('GET /api/saved_objects/resolve/{type}/{id}', () => {
beforeEach(async () => {
const coreContext = createCoreContext({ coreId });
server = createHttpService(coreContext);
server = createInternalHttpService(coreContext);
await server.preboot({ context: contextServiceMock.createPrebootContract() });
const contextService = new ContextService(coreContext);

View file

@ -17,7 +17,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { setupServer, createExportableType } from '@kbn/core-test-helpers-test-utils';
import {
setupServer,
createExportableType,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import {
LEGACY_URL_ALIAS_TYPE,
SavedObjectConfig,
@ -28,8 +32,6 @@ import {
type InternalSavedObjectsRequestHandlerContext,
} from '@kbn/core-saved-objects-server-internal';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const allowedTypes = ['index-pattern', 'visualization', 'dashboard'];
const config = { maxImportPayloadBytes: 26214400, maxImportExportSize: 10000 } as SavedObjectConfig;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
@ -37,7 +39,7 @@ const URL = '/api/saved_objects/_resolve_import_errors';
describe(`POST ${URL}`, () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
@ -75,7 +77,7 @@ describe(`POST ${URL}`, () => {
};
beforeEach(async () => {
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
handlerContext.savedObjects.typeRegistry.getImportableAndExportableTypes.mockReturnValue(
allowedTypes.map(createExportableType)
);
@ -101,8 +103,7 @@ describe(`POST ${URL}`, () => {
.fn()
.mockImplementation(() => importer as jest.Mocked<SavedObjectsImporter>);
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsResolveImportErrors.mockRejectedValue(
new Error('Oh no!') // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
@ -118,7 +119,7 @@ describe(`POST ${URL}`, () => {
});
it('formats successful response and records usage stats', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(URL)
.set('content-Type', 'multipart/form-data; boundary=BOUNDARY')
.send(
@ -149,7 +150,7 @@ describe(`POST ${URL}`, () => {
it('defaults migrationVersion to empty object', async () => {
savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [mockDashboard] });
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(URL)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -192,7 +193,7 @@ describe(`POST ${URL}`, () => {
// NOTE: changes to this scenario should be reflected in the docs
savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [mockDashboard] });
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(URL)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -230,7 +231,7 @@ describe(`POST ${URL}`, () => {
// NOTE: changes to this scenario should be reflected in the docs
savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [mockDashboard] });
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(URL)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -270,7 +271,7 @@ describe(`POST ${URL}`, () => {
savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [mockVisualization] });
savedObjectsClient.bulkGet.mockResolvedValueOnce({ saved_objects: [mockIndexPattern] });
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(URL)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -319,7 +320,7 @@ describe(`POST ${URL}`, () => {
// NOTE: changes to this scenario should be reflected in the docs
savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [mockVisualization] });
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(URL)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -382,7 +383,7 @@ describe(`POST ${URL}`, () => {
};
savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [obj1, obj2] });
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(`${URL}?createNewCopies=true`)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(
@ -485,7 +486,7 @@ describe(`POST ${URL}`, () => {
saved_objects: [legacyUrlAliasObj2],
});
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.post(`${URL}?compatibilityMode=true`)
.set('content-Type', 'multipart/form-data; boundary=EXAMPLE')
.send(

View file

@ -14,7 +14,11 @@ import {
coreUsageStatsClientMock,
coreUsageDataServiceMock,
} from '@kbn/core-usage-data-server-mocks';
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
import {
createHiddenTypeVariants,
setupServer,
SetupServerReturn,
} from '@kbn/core-test-helpers-test-utils';
import {
registerUpdateRoute,
type InternalSavedObjectsRequestHandlerContext,
@ -22,8 +26,6 @@ import {
import { loggerMock } from '@kbn/logging-mocks';
import { deprecationMock, setupConfig } from './routes_test_utils';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const testTypes = [
{ name: 'index-pattern', hide: false }, // multi-namespace type
{ name: 'hidden-type', hide: true }, // hidden
@ -32,7 +34,7 @@ const testTypes = [
describe('PUT /api/saved_objects/{type}/{id?}', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let handlerContext: SetupServerReturn['handlerContext'];
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
@ -50,7 +52,7 @@ describe('PUT /api/saved_objects/{type}/{id?}', () => {
references: [],
};
({ server, httpSetup, handlerContext } = await setupServer());
({ server, createRouter, handlerContext } = await setupServer());
savedObjectsClient = handlerContext.savedObjects.client;
savedObjectsClient.update.mockResolvedValue(clientResponse);
@ -60,8 +62,7 @@ describe('PUT /api/saved_objects/{type}/{id?}', () => {
.find((fullTest) => fullTest.name === typename);
});
const router =
httpSetup.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
const router = createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
coreUsageStatsClient = coreUsageStatsClientMock.create();
coreUsageStatsClient.incrementSavedObjectsUpdate.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
@ -98,7 +99,7 @@ describe('PUT /api/saved_objects/{type}/{id?}', () => {
};
savedObjectsClient.update.mockResolvedValue(clientResponse);
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.put('/api/saved_objects/index-pattern/logstash-*')
.set('x-elastic-internal-origin', 'kibana')
.send({
@ -117,7 +118,7 @@ describe('PUT /api/saved_objects/{type}/{id?}', () => {
});
it('calls upon savedObjectClient.update', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.put('/api/saved_objects/index-pattern/logstash-*')
.set('x-elastic-internal-origin', 'kibana')
.send({
@ -135,7 +136,7 @@ describe('PUT /api/saved_objects/{type}/{id?}', () => {
});
it('returns with status 400 for types hidden from the HTTP APIs', async () => {
const result = await supertest(httpSetup.server.listener)
const result = await supertest(server.listener)
.put('/api/saved_objects/hidden-from-http/hiddenId')
.set('x-elastic-internal-origin', 'kibana')
.send({
@ -146,7 +147,7 @@ describe('PUT /api/saved_objects/{type}/{id?}', () => {
});
it('logs a warning message when called', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.put('/api/saved_objects/index-pattern/logstash-*')
.set('x-elastic-internal-origin', 'kibana')
.send({ attributes: { title: 'Logging test' }, version: 'log' })
@ -155,7 +156,7 @@ describe('PUT /api/saved_objects/{type}/{id?}', () => {
});
it('passes deprecation configuration to the router arguments', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.put('/api/saved_objects/index-pattern/logstash-*')
.set('x-elastic-internal-origin', 'kibana')
.send({ attributes: { title: 'Logging test' }, version: 'log' })

View file

@ -8,11 +8,11 @@
*/
import supertest from 'supertest';
import { createCoreContext, createHttpService } from '@kbn/core-http-server-mocks';
import { createCoreContext } from '@kbn/core-http-server-mocks';
import type { HttpService, InternalHttpServicePreboot } from '@kbn/core-http-server-internal';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import { registerPrebootStatusRoute } from '@kbn/core-status-server-internal/src/routes';
import { createInternalHttpService } from '../../utilities';
const coreId = Symbol('core');
@ -23,7 +23,7 @@ describe('GET /api/status', () => {
const setupServer = async () => {
const coreContext = createCoreContext({ coreId });
server = createHttpService(coreContext);
server = createInternalHttpService(coreContext);
httpPreboot = await server.preboot({
context: contextServiceMock.createPrebootContract(),
});

View file

@ -12,7 +12,7 @@ import supertest from 'supertest';
import { omit } from 'lodash';
import { ContextService } from '@kbn/core-http-context-server-internal';
import { createCoreContext, createHttpService } from '@kbn/core-http-server-mocks';
import { createCoreContext } from '@kbn/core-http-server-mocks';
import type { HttpService, InternalHttpServiceSetup } from '@kbn/core-http-server-internal';
import { metricsServiceMock } from '@kbn/core-metrics-server-mocks';
import type { MetricsServiceSetup } from '@kbn/core-metrics-server';
@ -21,6 +21,7 @@ import { statusServiceMock } from '@kbn/core-status-server-mocks';
import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks';
import { contextServiceMock } from '@kbn/core-http-context-server-mocks';
import { registerStatusRoute } from '@kbn/core-status-server-internal';
import { createInternalHttpService } from '../../utilities';
const coreId = Symbol('core');
@ -49,7 +50,7 @@ describe('GET /api/status', () => {
const coreContext = createCoreContext({ coreId });
const contextService = new ContextService(coreContext);
server = createHttpService(coreContext);
server = createInternalHttpService(coreContext);
await server.preboot({ context: contextServiceMock.createPrebootContract() });
httpSetup = await server.setup({
context: contextService.setup({ pluginDependencies: new Map() }),

View file

@ -0,0 +1,39 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/
import type { CoreContext } from '@kbn/core-base-server-internal';
import { HttpService } from '@kbn/core-http-server-internal';
import { createCoreContext } from '@kbn/core-http-server-mocks';
export {
HttpService,
type InternalHttpServicePreboot,
type InternalHttpServiceSetup,
} from '@kbn/core-http-server-internal';
/**
* @internal
* @remarks Only use this in core-owned code!
*/
export const createInternalHttpService = ({
buildNum,
...overrides
}: Partial<CoreContext & { buildNum: number }> = {}): HttpService => {
const ctx = createCoreContext(overrides);
if (buildNum !== undefined) {
ctx.env = {
...ctx.env,
packageInfo: {
...ctx.env.packageInfo,
buildNum,
},
};
}
return new HttpService(ctx);
};

View file

@ -0,0 +1,10 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/
export { createInternalHttpService } from './create_internal_http_service';

View file

@ -8,8 +8,7 @@
*/
import supertest from 'supertest';
import type { HttpService, InternalHttpServiceSetup } from '@kbn/core-http-server-internal';
import { setupServer } from '@kbn/core-test-helpers-test-utils';
import { setupServer, SetupServerReturn } from '@kbn/core-test-helpers-test-utils';
import { registerCreateRoute } from '../register_create_route';
import { MockUrlService } from '../../../../../common/mocks';
import { httpServiceMock } from '@kbn/core/server/mocks';
@ -18,13 +17,13 @@ const url = new MockUrlService();
const http = httpServiceMock.createSetupContract();
describe('POST /api/short_url', () => {
let server: HttpService;
let httpSetup: InternalHttpServiceSetup;
let server: SetupServerReturn['server'];
let createRouter: SetupServerReturn['createRouter'];
beforeAll(async () => {
const setup = await setupServer();
server = setup.server;
httpSetup = setup.httpSetup;
createRouter = setup.createRouter;
url.locators.get = jest.fn().mockImplementation((locatorId) => {
if (locatorId === 'LEGACY_SHORT_URL_LOCATOR') {
@ -34,7 +33,7 @@ describe('POST /api/short_url', () => {
});
http.basePath.get = jest.fn().mockReturnValue('');
registerCreateRoute(httpSetup.createRouter(''), url, http);
registerCreateRoute(createRouter(''), url, http);
await server.start();
});
@ -57,7 +56,7 @@ describe('POST /api/short_url', () => {
},
};
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/short_url')
.send(payload)
.expect(200)
@ -74,7 +73,7 @@ describe('POST /api/short_url', () => {
},
};
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/short_url')
.send(payload)
.expect(400)
@ -94,7 +93,7 @@ describe('POST /api/short_url', () => {
// Override the locator mock for this test
(url.locators.get as jest.Mock).mockReturnValueOnce(undefined);
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/api/short_url')
.send(payload)
.expect(409)

View file

@ -27,7 +27,6 @@
"@kbn/licensing-plugin",
"@kbn/core-rendering-browser",
"@kbn/std",
"@kbn/core-http-server-internal",
"@kbn/core-test-helpers-test-utils",
"@kbn/core-logging-server-mocks",
"@kbn/core-http-router-server-mocks"

View file

@ -9,25 +9,22 @@
import { BehaviorSubject } from 'rxjs';
import { type MetricsServiceSetup, ServiceStatus, ServiceStatusLevels } from '@kbn/core/server';
import {
type MetricsServiceSetup,
RequestHandlerContext,
ServiceStatus,
ServiceStatusLevels,
} from '@kbn/core/server';
import {
contextServiceMock,
loggingSystemMock,
metricsServiceMock,
executionContextServiceMock,
} from '@kbn/core/server/mocks';
import { createHttpService } from '@kbn/core-http-server-mocks';
import {
createHttpService,
HttpIntegrationServiceSetupContractMock,
} from '@kbn/core-http-server-mocks';
import { registerStatsRoute } from '../stats';
import supertest from 'supertest';
import { CollectorSet } from '../../collector';
type HttpService = ReturnType<typeof createHttpService>;
type HttpSetup = Awaited<ReturnType<HttpService['setup']>>;
type HttpSetup = HttpIntegrationServiceSetupContractMock;
describe('/api/stats', () => {
let server: HttpService;
@ -37,18 +34,15 @@ describe('/api/stats', () => {
beforeEach(async () => {
server = createHttpService();
await server.preboot({ context: contextServiceMock.createPrebootContract() });
httpSetup = await server.setup({
context: contextServiceMock.createSetupContract(),
executionContext: executionContextServiceMock.createInternalSetupContract(),
});
await server.preboot();
httpSetup = await server.setup();
overallStatus$ = new BehaviorSubject<ServiceStatus>({
level: ServiceStatusLevels.available,
summary: 'everything is working',
});
metrics = metricsServiceMock.createSetupContract();
const router = httpSetup.createRouter<RequestHandlerContext>('');
const router = httpSetup.createRouter('');
registerStatsRoute({
router,
collectorSet: new CollectorSet({

View file

@ -5,7 +5,7 @@
* 2.0.
*/
import { setupServer } from '@kbn/core-test-helpers-test-utils';
import { setupServer, SetupServerReturn } from '@kbn/core-test-helpers-test-utils';
import { loggingSystemMock } from '@kbn/core/server/mocks';
import { licensingMock } from '@kbn/licensing-plugin/server/mocks';
import { INTERNAL_ROUTES } from '@kbn/reporting-common';
@ -19,13 +19,11 @@ import {
} from '../../../../test_helpers';
import { registerDeprecationsRoutes } from '../deprecations';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
describe(`GET ${INTERNAL_ROUTES.MIGRATE.GET_ILM_POLICY_STATUS}`, () => {
jest.setTimeout(6000);
const reportingSymbol = Symbol('reporting');
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
const mockConfig = createMockConfigSchema({
queue: { indexInterval: 'year', timeout: 10000, pollEnabled: true },
@ -37,13 +35,13 @@ describe(`GET ${INTERNAL_ROUTES.MIGRATE.GET_ILM_POLICY_STATUS}`, () => {
}) =>
createMockReportingCore(
mockConfig,
createMockPluginSetup({ security, router: httpSetup.createRouter('') }),
createMockPluginSetup({ security, router: createRouter('') }),
await createMockPluginStart({ licensing: licensingMock.createStart() }, mockConfig)
);
beforeEach(async () => {
jest.clearAllMocks();
({ server, httpSetup } = await setupServer(reportingSymbol));
({ server, createRouter } = await setupServer(reportingSymbol));
});
afterEach(async () => {
@ -56,7 +54,7 @@ describe(`GET ${INTERNAL_ROUTES.MIGRATE.GET_ILM_POLICY_STATUS}`, () => {
registerDeprecationsRoutes(core, loggingSystemMock.createLogger());
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(INTERNAL_ROUTES.MIGRATE.GET_ILM_POLICY_STATUS)
.expect(200)
.then(/* Ignore result */);
@ -70,7 +68,7 @@ describe(`GET ${INTERNAL_ROUTES.MIGRATE.GET_ILM_POLICY_STATUS}`, () => {
registerDeprecationsRoutes(core, loggingSystemMock.createLogger());
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(INTERNAL_ROUTES.MIGRATE.GET_ILM_POLICY_STATUS)
.expect(200)
.then(/* Ignore result */);
@ -88,7 +86,7 @@ describe(`GET ${INTERNAL_ROUTES.MIGRATE.GET_ILM_POLICY_STATUS}`, () => {
registerDeprecationsRoutes(core, loggingSystemMock.createLogger());
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(INTERNAL_ROUTES.MIGRATE.GET_ILM_POLICY_STATUS)
.expect(200)
.then(/* Ignore result */);

View file

@ -8,7 +8,7 @@
import * as Rx from 'rxjs';
import supertest from 'supertest';
import { setupServer } from '@kbn/core-test-helpers-test-utils';
import { setupServer, SetupServerReturn } from '@kbn/core-test-helpers-test-utils';
import { docLinksServiceMock, loggingSystemMock } from '@kbn/core/server/mocks';
import { INTERNAL_ROUTES } from '@kbn/reporting-common';
import { createMockConfigSchema } from '@kbn/reporting-mocks-server';
@ -20,8 +20,6 @@ import { createMockPluginSetup, createMockReportingCore } from '../../../../test
import { ReportingRequestHandlerContext } from '../../../../types';
import { registerDiagnoseBrowser } from '../browser';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const devtoolMessage = 'DevTools listening on (ws://localhost:4000)';
const fontNotFoundMessage = 'Could not find the default font';
@ -31,8 +29,9 @@ describe(`GET ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}`, () => {
const mockLogger = loggingSystemMock.createLogger();
let server: SetupServerReturn['server'];
let registerRouteHandlerContext: SetupServerReturn['registerRouteHandlerContext'];
let usageCounter: IUsageCounter;
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let core: ReportingCore;
let screenshotting: jest.Mocked<ScreenshottingStart>;
@ -42,8 +41,8 @@ describe(`GET ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}`, () => {
});
beforeEach(async () => {
({ server, httpSetup } = await setupServer(reportingSymbol));
httpSetup.registerRouteHandlerContext<ReportingRequestHandlerContext, 'reporting'>(
({ server, createRouter, registerRouteHandlerContext } = await setupServer(reportingSymbol));
registerRouteHandlerContext<ReportingRequestHandlerContext, 'reporting'>(
reportingSymbol,
'reporting',
() => reportingMock.createStart()
@ -53,7 +52,7 @@ describe(`GET ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}`, () => {
core = await createMockReportingCore(
config,
createMockPluginSetup({
router: httpSetup.createRouter(''),
router: createRouter(''),
security: null,
docLinks: {
...docLinksSetupMock,
@ -88,7 +87,7 @@ describe(`GET ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}`, () => {
screenshotting.diagnose.mockReturnValue(Rx.of(devtoolMessage));
return supertest(httpSetup.server.listener)
return supertest(server.listener)
.get(INTERNAL_ROUTES.DIAGNOSE.BROWSER)
.expect(200)
.then(({ body }) => {
@ -104,7 +103,7 @@ describe(`GET ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}`, () => {
await server.start();
screenshotting.diagnose.mockReturnValue(Rx.of(logs));
return supertest(httpSetup.server.listener)
return supertest(server.listener)
.get(INTERNAL_ROUTES.DIAGNOSE.BROWSER)
.expect(200)
.then(({ body }) => {
@ -128,7 +127,7 @@ describe(`GET ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}`, () => {
await server.start();
screenshotting.diagnose.mockReturnValue(Rx.of(fontErrorLog));
return supertest(httpSetup.server.listener)
return supertest(server.listener)
.get(INTERNAL_ROUTES.DIAGNOSE.BROWSER)
.expect(200)
.then(({ body }) => {
@ -150,7 +149,7 @@ describe(`GET ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}`, () => {
await server.start();
screenshotting.diagnose.mockReturnValue(Rx.of(`${devtoolMessage}\n${fontNotFoundMessage}`));
return supertest(httpSetup.server.listener)
return supertest(server.listener)
.get(INTERNAL_ROUTES.DIAGNOSE.BROWSER)
.expect(200)
.then(({ body }) => {
@ -175,7 +174,7 @@ describe(`GET ${INTERNAL_ROUTES.DIAGNOSE.BROWSER}`, () => {
screenshotting.diagnose.mockReturnValue(Rx.of(devtoolMessage));
await supertest(httpSetup.server.listener).get(INTERNAL_ROUTES.DIAGNOSE.BROWSER).expect(200);
await supertest(server.listener).get(INTERNAL_ROUTES.DIAGNOSE.BROWSER).expect(200);
expect(usageCounter.incrementCounter).toHaveBeenCalledTimes(1);
expect(usageCounter.incrementCounter).toHaveBeenCalledWith({

View file

@ -9,7 +9,7 @@ import rison from '@kbn/rison';
import { BehaviorSubject } from 'rxjs';
import supertest from 'supertest';
import { setupServer } from '@kbn/core-test-helpers-test-utils';
import { SetupServerReturn, setupServer } from '@kbn/core-test-helpers-test-utils';
import { coreMock, loggingSystemMock } from '@kbn/core/server/mocks';
import { licensingMock } from '@kbn/licensing-plugin/server/mocks';
import { INTERNAL_ROUTES } from '@kbn/reporting-common';
@ -31,14 +31,13 @@ import { ReportingRequestHandlerContext } from '../../../../types';
import { EventTracker } from '../../../../usage';
import { registerGenerationRoutesInternal } from '../generate_from_jobparams';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
describe(`POST ${INTERNAL_ROUTES.GENERATE_PREFIX}`, () => {
const reportingSymbol = Symbol('reporting');
let server: SetupServerReturn['server'];
let registerRouteHandlerContext: SetupServerReturn['registerRouteHandlerContext'];
let usageCounter: IUsageCounter;
let eventTracker: EventTracker;
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let mockExportTypesRegistry: ExportTypesRegistry;
let reportingCore: ReportingCore;
let store: ReportingStore;
@ -59,8 +58,8 @@ describe(`POST ${INTERNAL_ROUTES.GENERATE_PREFIX}`, () => {
);
beforeEach(async () => {
({ server, httpSetup } = await setupServer(reportingSymbol));
httpSetup.registerRouteHandlerContext<ReportingRequestHandlerContext, 'reporting'>(
({ server, createRouter, registerRouteHandlerContext } = await setupServer(reportingSymbol));
registerRouteHandlerContext<ReportingRequestHandlerContext, 'reporting'>(
reportingSymbol,
'reporting',
() => reportingMock.createStart()
@ -68,7 +67,7 @@ describe(`POST ${INTERNAL_ROUTES.GENERATE_PREFIX}`, () => {
const mockSetupDeps = createMockPluginSetup({
security: { license: { isEnabled: () => true, getFeature: () => true } },
router: httpSetup.createRouter(''),
router: createRouter(''),
});
const mockStartDeps = await createMockPluginStart(
@ -125,7 +124,7 @@ describe(`POST ${INTERNAL_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${INTERNAL_ROUTES.GENERATE_PREFIX}/printablePdfV2`)
.expect(400)
.then(({ body }) =>
@ -140,7 +139,7 @@ describe(`POST ${INTERNAL_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${INTERNAL_ROUTES.GENERATE_PREFIX}/printablePdfV2?jobParams=foo:`)
.expect(400)
.then(({ body }) => expect(body.message).toMatchInlineSnapshot('"invalid rison: foo:"'));
@ -151,7 +150,7 @@ describe(`POST ${INTERNAL_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${INTERNAL_ROUTES.GENERATE_PREFIX}/printablePdfV2`)
.send({ jobParams: `foo:` })
.expect(400)
@ -163,7 +162,7 @@ describe(`POST ${INTERNAL_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${INTERNAL_ROUTES.GENERATE_PREFIX}/TonyHawksProSkater2`)
.send({ jobParams: rison.encode({ title: `abc` }) })
.expect(400)
@ -177,7 +176,7 @@ describe(`POST ${INTERNAL_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${INTERNAL_ROUTES.GENERATE_PREFIX}/printablePdfV2`)
.send({ jobParams: rison.encode({ browserTimezone: 'America/Amsterdam', title: `abc` }) })
.expect(400)
@ -193,7 +192,7 @@ describe(`POST ${INTERNAL_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${INTERNAL_ROUTES.GENERATE_PREFIX}/printablePdfV2`)
.send({ jobParams: rison.encode({ title: `abc` }) })
.expect(500);
@ -204,7 +203,7 @@ describe(`POST ${INTERNAL_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${INTERNAL_ROUTES.GENERATE_PREFIX}/printablePdfV2`)
.send({
jobParams: rison.encode({
@ -245,7 +244,7 @@ describe(`POST ${INTERNAL_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${INTERNAL_ROUTES.GENERATE_PREFIX}/printablePdfV2`)
.send({
jobParams: rison.encode({
@ -269,7 +268,7 @@ describe(`POST ${INTERNAL_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${INTERNAL_ROUTES.GENERATE_PREFIX}/printablePdfV2`)
.send({
jobParams: rison.encode({

View file

@ -14,7 +14,7 @@ jest.mock('../../../../lib/content_stream', () => ({
}));
import type { estypes } from '@elastic/elasticsearch';
import { setupServer } from '@kbn/core-test-helpers-test-utils';
import { setupServer, SetupServerReturn } from '@kbn/core-test-helpers-test-utils';
import { ElasticsearchClientMock, coreMock } from '@kbn/core/server/mocks';
import { licensingMock } from '@kbn/licensing-plugin/server/mocks';
import { INTERNAL_ROUTES } from '@kbn/reporting-common';
@ -37,14 +37,13 @@ import { EventTracker } from '../../../../usage';
import { STATUS_CODES } from '../../../common/jobs/constants';
import { registerJobInfoRoutesInternal as registerJobInfoRoutes } from '../jobs';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
describe(`Reporting Job Management Routes: Internal`, () => {
const reportingSymbol = Symbol('reporting');
let server: SetupServerReturn['server'];
let eventTracker: EventTracker;
let usageCounter: IUsageCounter;
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let registerRouteHandlerContext: SetupServerReturn['registerRouteHandlerContext'];
let exportTypesRegistry: ExportTypesRegistry;
let reportingCore: ReportingCore;
let mockSetupDeps: ReportingInternalSetup;
@ -79,8 +78,8 @@ describe(`Reporting Job Management Routes: Internal`, () => {
const mockConfigSchema = createMockConfigSchema();
beforeEach(async () => {
({ server, httpSetup } = await setupServer(reportingSymbol));
httpSetup.registerRouteHandlerContext<ReportingRequestHandlerContext, 'reporting'>(
({ server, createRouter, registerRouteHandlerContext } = await setupServer(reportingSymbol));
registerRouteHandlerContext<ReportingRequestHandlerContext, 'reporting'>(
reportingSymbol,
'reporting',
() => reportingMock.createStart()
@ -90,7 +89,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
security: {
license: { isEnabled: () => true },
},
router: httpSetup.createRouter(''),
router: createRouter(''),
});
mockStartDeps = await createMockPluginStart(
@ -160,7 +159,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/1`)
.expect(400)
.then(({ body }) =>
@ -186,7 +185,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dope`)
.expect(401)
.then(({ body }) =>
@ -200,7 +199,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`)
.expect(404);
});
@ -217,9 +216,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
await server.start();
await supertest(httpSetup.server.listener)
.get(`${INTERNAL_ROUTES.JOBS.INFO_PREFIX}/test`)
.expect(200);
await supertest(server.listener).get(`${INTERNAL_ROUTES.JOBS.INFO_PREFIX}/test`).expect(200);
});
it('when a job is incomplete, "internal" API endpoint should return appropriate response', async () => {
@ -233,7 +230,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
registerJobInfoRoutes(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`)
.expect(STATUS_CODES.PENDING.INTERNAL)
.expect('Content-Type', 'text/plain; charset=utf-8')
@ -253,7 +250,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
registerJobInfoRoutes(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`)
.expect(STATUS_CODES.FAILED.INTERNAL)
.expect('Content-Type', 'application/json; charset=utf-8')
@ -267,7 +264,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
registerJobInfoRoutes(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`)
.expect(STATUS_CODES.COMPLETED)
.expect('Content-Type', 'text/csv; charset=utf-8')
@ -284,7 +281,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dope`)
.expect(STATUS_CODES.COMPLETED)
.expect('Content-Type', 'text/csv; charset=utf-8')
@ -300,7 +297,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
registerJobInfoRoutes(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`)
.expect(STATUS_CODES.COMPLETED)
.expect('Content-Type', 'text/csv; charset=utf-8')
@ -317,7 +314,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
registerJobInfoRoutes(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`)
.expect(400)
.then(({ body }) => {
@ -339,7 +336,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
registerJobInfoRoutes(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/japanese-dashboard`)
.expect(STATUS_CODES.COMPLETED)
.expect('Content-Type', 'application/pdf')
@ -356,7 +353,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
registerJobInfoRoutes(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${INTERNAL_ROUTES.JOBS.INFO_PREFIX}/dank`)
.expect(200)
.expect('Content-Type', 'application/json; charset=utf-8');
@ -373,7 +370,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
registerJobInfoRoutes(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`)
.expect(STATUS_CODES.COMPLETED)
.expect('Content-Type', 'text/csv; charset=utf-8')
@ -391,7 +388,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
registerJobInfoRoutes(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.delete(`${INTERNAL_ROUTES.JOBS.DELETE_PREFIX}/dank`)
.expect(200)
.expect('Content-Type', 'application/json; charset=utf-8');
@ -408,7 +405,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
registerJobInfoRoutes(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(INTERNAL_ROUTES.JOBS.COUNT)
.expect(200)
.expect('Content-Type', 'text/plain; charset=utf-8');
@ -438,7 +435,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
registerJobInfoRoutes(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.delete(`${INTERNAL_ROUTES.JOBS.DELETE_PREFIX}/dank`)
.expect(500)
.expect('Content-Type', 'application/json; charset=utf-8');
@ -451,9 +448,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
registerJobInfoRoutes(reportingCore);
await server.start();
await supertest(httpSetup.server.listener).get(
`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`
);
await supertest(server.listener).get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`);
expect(eventTracker.downloadReport).toHaveBeenCalledTimes(1);
});
@ -474,7 +469,7 @@ describe(`Reporting Job Management Routes: Internal`, () => {
registerJobInfoRoutes(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.delete(`${INTERNAL_ROUTES.JOBS.DELETE_PREFIX}/dank`)
.expect(200)
.expect('Content-Type', 'application/json; charset=utf-8');

View file

@ -13,7 +13,7 @@ jest.mock('../../../../lib/content_stream', () => ({
getContentStream: jest.fn(),
}));
import { setupServer } from '@kbn/core-test-helpers-test-utils';
import { setupServer, SetupServerReturn } from '@kbn/core-test-helpers-test-utils';
import {
ElasticsearchClientMock,
coreMock,
@ -48,8 +48,6 @@ import {
import { auditLoggerMock } from '@kbn/security-plugin/server/audit/mocks';
import { TaskManagerStartContract } from '@kbn/task-manager-plugin/server';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const fakeRawRequest = {
headers: {
authorization: `ApiKey skdjtq4u543yt3rhewrh`,
@ -150,7 +148,7 @@ describe(`Reporting Schedule Management Routes: Internal`, () => {
let server: SetupServerReturn['server'];
let eventTracker: EventTracker;
let usageCounter: IUsageCounter;
let httpSetup: SetupServerReturn['httpSetup'];
let httpSetup: SetupServerReturn;
let exportTypesRegistry: ExportTypesRegistry;
let reportingCore: ReportingCore;
let mockSetupDeps: ReportingInternalSetup;
@ -169,7 +167,8 @@ describe(`Reporting Schedule Management Routes: Internal`, () => {
const mockConfigSchema = createMockConfigSchema();
beforeEach(async () => {
({ server, httpSetup } = await setupServer(reportingSymbol));
httpSetup = await setupServer(reportingSymbol);
server = httpSetup.server;
httpSetup.registerRouteHandlerContext<ReportingRequestHandlerContext, 'reporting'>(
reportingSymbol,
'reporting',

View file

@ -9,7 +9,7 @@ import rison from '@kbn/rison';
import { BehaviorSubject } from 'rxjs';
import supertest from 'supertest';
import { setupServer } from '@kbn/core-test-helpers-test-utils';
import { setupServer, type SetupServerReturn } from '@kbn/core-test-helpers-test-utils';
import { coreMock, loggingSystemMock } from '@kbn/core/server/mocks';
import { licensingMock } from '@kbn/licensing-plugin/server/mocks';
import { INTERNAL_ROUTES } from '@kbn/reporting-common';
@ -29,8 +29,6 @@ import { registerScheduleRoutesInternal } from '../schedule_from_jobparams';
import { FakeRawRequest, KibanaRequest, SavedObjectsClientContract } from '@kbn/core/server';
import { auditLoggerMock } from '@kbn/security-plugin/server/audit/mocks';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const fakeRawRequest: FakeRawRequest = {
headers: {
authorization: `ApiKey skdjtq4u543yt3rhewrh`,
@ -40,8 +38,8 @@ const fakeRawRequest: FakeRawRequest = {
describe(`POST ${INTERNAL_ROUTES.SCHEDULE_PREFIX}`, () => {
const reportingSymbol = Symbol('reporting');
let httpSetup: SetupServerReturn;
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let mockExportTypesRegistry: ExportTypesRegistry;
let reportingCore: ReportingCore;
let soClient: SavedObjectsClientContract;
@ -61,12 +59,13 @@ describe(`POST ${INTERNAL_ROUTES.SCHEDULE_PREFIX}`, () => {
);
beforeEach(async () => {
({ server, httpSetup } = await setupServer(reportingSymbol));
httpSetup = await setupServer(reportingSymbol);
httpSetup.registerRouteHandlerContext<ReportingRequestHandlerContext, 'reporting'>(
reportingSymbol,
'reporting',
() => reportingMock.createStart()
);
server = httpSetup.server;
const mockSetupDeps = createMockPluginSetup({
security: { license: { isEnabled: () => true, getFeature: () => true } },

View file

@ -9,7 +9,7 @@ import rison from '@kbn/rison';
import { BehaviorSubject } from 'rxjs';
import supertest from 'supertest';
import { setupServer } from '@kbn/core-test-helpers-test-utils';
import { setupServer, SetupServerReturn } from '@kbn/core-test-helpers-test-utils';
import { coreMock, loggingSystemMock } from '@kbn/core/server/mocks';
import { licensingMock } from '@kbn/licensing-plugin/server/mocks';
import { PUBLIC_ROUTES } from '@kbn/reporting-common';
@ -30,14 +30,13 @@ import { ReportingRequestHandlerContext } from '../../../types';
import { EventTracker } from '../../../usage';
import { registerGenerationRoutesPublic } from '../generate_from_jobparams';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
describe(`POST ${PUBLIC_ROUTES.GENERATE_PREFIX}`, () => {
const reportingSymbol = Symbol('reporting');
let server: SetupServerReturn['server'];
let eventTracker: EventTracker;
let usageCounter: IUsageCounter;
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let registerRouteHandlerContext: SetupServerReturn['registerRouteHandlerContext'];
let mockExportTypesRegistry: ExportTypesRegistry;
let reportingCore: ReportingCore;
let store: ReportingStore;
@ -58,8 +57,8 @@ describe(`POST ${PUBLIC_ROUTES.GENERATE_PREFIX}`, () => {
);
beforeEach(async () => {
({ server, httpSetup } = await setupServer(reportingSymbol));
httpSetup.registerRouteHandlerContext<ReportingRequestHandlerContext, 'reporting'>(
({ server, createRouter, registerRouteHandlerContext } = await setupServer(reportingSymbol));
registerRouteHandlerContext<ReportingRequestHandlerContext, 'reporting'>(
reportingSymbol,
'reporting',
() => reportingMock.createStart()
@ -67,7 +66,7 @@ describe(`POST ${PUBLIC_ROUTES.GENERATE_PREFIX}`, () => {
const mockSetupDeps = createMockPluginSetup({
security: { license: { isEnabled: () => true, getFeature: () => true } },
router: httpSetup.createRouter(''),
router: createRouter(''),
});
const mockStartDeps = await createMockPluginStart(
@ -124,7 +123,7 @@ describe(`POST ${PUBLIC_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${PUBLIC_ROUTES.GENERATE_PREFIX}/printablePdfV2`)
.expect(400)
.then(({ body }) =>
@ -139,7 +138,7 @@ describe(`POST ${PUBLIC_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${PUBLIC_ROUTES.GENERATE_PREFIX}/printablePdfV2?jobParams=foo:`)
.expect(400)
.then(({ body }) => expect(body.message).toMatchInlineSnapshot('"invalid rison: foo:"'));
@ -150,7 +149,7 @@ describe(`POST ${PUBLIC_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${PUBLIC_ROUTES.GENERATE_PREFIX}/printablePdfV2`)
.send({ jobParams: `foo:` })
.expect(400)
@ -162,7 +161,7 @@ describe(`POST ${PUBLIC_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${PUBLIC_ROUTES.GENERATE_PREFIX}/TonyHawksProSkater2`)
.send({ jobParams: rison.encode({ title: `abc` }) })
.expect(400)
@ -176,7 +175,7 @@ describe(`POST ${PUBLIC_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${PUBLIC_ROUTES.GENERATE_PREFIX}/printablePdfV2`)
.send({ jobParams: rison.encode({ browserTimezone: 'America/Amsterdam', title: `abc` }) })
.expect(400)
@ -192,7 +191,7 @@ describe(`POST ${PUBLIC_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${PUBLIC_ROUTES.GENERATE_PREFIX}/printablePdfV2`)
.send({ jobParams: rison.encode({ title: `abc` }) })
.expect(500);
@ -203,7 +202,7 @@ describe(`POST ${PUBLIC_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${PUBLIC_ROUTES.GENERATE_PREFIX}/printablePdfV2`)
.send({
jobParams: rison.encode({
@ -243,7 +242,7 @@ describe(`POST ${PUBLIC_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${PUBLIC_ROUTES.GENERATE_PREFIX}/printablePdf`)
.send({
jobParams: rison.encode({
@ -285,7 +284,7 @@ describe(`POST ${PUBLIC_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${PUBLIC_ROUTES.GENERATE_PREFIX}/printablePdfV2`)
.send({
jobParams: rison.encode({
@ -308,7 +307,7 @@ describe(`POST ${PUBLIC_ROUTES.GENERATE_PREFIX}`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post(`${PUBLIC_ROUTES.GENERATE_PREFIX}/printablePdfV2`)
.send({
jobParams: rison.encode({

View file

@ -14,7 +14,7 @@ import { Readable } from 'stream';
import supertest from 'supertest';
import type { estypes } from '@elastic/elasticsearch';
import { setupServer } from '@kbn/core-test-helpers-test-utils';
import { setupServer, SetupServerReturn } from '@kbn/core-test-helpers-test-utils';
import { coreMock, type ElasticsearchClientMock } from '@kbn/core/server/mocks';
import { licensingMock } from '@kbn/licensing-plugin/server/mocks';
import { PUBLIC_ROUTES } from '@kbn/reporting-common';
@ -35,14 +35,13 @@ import { ReportingRequestHandlerContext } from '../../../types';
import { EventTracker } from '../../../usage';
import { registerJobInfoRoutesPublic } from '../jobs';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
describe(`Reporting Job Management Routes: Public`, () => {
const reportingSymbol = Symbol('reporting');
let server: SetupServerReturn['server'];
let eventTracker: EventTracker;
let usageCounter: IUsageCounter;
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let registerRouteHandlerContext: SetupServerReturn['registerRouteHandlerContext'];
let exportTypesRegistry: ExportTypesRegistry;
let reportingCore: ReportingCore;
let mockSetupDeps: ReportingInternalSetup;
@ -75,8 +74,8 @@ describe(`Reporting Job Management Routes: Public`, () => {
const mockConfigSchema = createMockConfigSchema();
beforeEach(async () => {
({ server, httpSetup } = await setupServer(reportingSymbol));
httpSetup.registerRouteHandlerContext<ReportingRequestHandlerContext, 'reporting'>(
({ server, createRouter, registerRouteHandlerContext } = await setupServer(reportingSymbol));
registerRouteHandlerContext<ReportingRequestHandlerContext, 'reporting'>(
reportingSymbol,
'reporting',
() => reportingMock.createStart()
@ -86,7 +85,7 @@ describe(`Reporting Job Management Routes: Public`, () => {
security: {
license: { isEnabled: () => true },
},
router: httpSetup.createRouter(''),
router: createRouter(''),
});
mockStartDeps = await createMockPluginStart(
@ -149,7 +148,7 @@ describe(`Reporting Job Management Routes: Public`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/1`)
.expect(400)
.then(({ body }) =>
@ -175,7 +174,7 @@ describe(`Reporting Job Management Routes: Public`, () => {
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dope`)
.expect(401)
.then(({ body }) =>
@ -189,9 +188,7 @@ describe(`Reporting Job Management Routes: Public`, () => {
await server.start();
await supertest(httpSetup.server.listener)
.get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`)
.expect(404);
await supertest(server.listener).get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`).expect(404);
});
it('when a job is incomplete', async () => {
@ -205,7 +202,7 @@ describe(`Reporting Job Management Routes: Public`, () => {
registerJobInfoRoutesPublic(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`)
.expect(503)
.expect('Content-Type', 'text/plain; charset=utf-8')
@ -225,7 +222,7 @@ describe(`Reporting Job Management Routes: Public`, () => {
registerJobInfoRoutesPublic(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`)
.expect(500)
.expect('Content-Type', 'application/json; charset=utf-8')
@ -239,7 +236,7 @@ describe(`Reporting Job Management Routes: Public`, () => {
registerJobInfoRoutesPublic(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`)
.expect(200)
.expect('Content-Type', 'text/csv; charset=utf-8')
@ -264,7 +261,7 @@ describe(`Reporting Job Management Routes: Public`, () => {
registerJobInfoRoutesPublic(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.delete(`${PUBLIC_ROUTES.JOBS.DELETE_PREFIX}/denk`)
.expect(500)
.expect('Content-Type', 'application/json; charset=utf-8');
@ -277,7 +274,7 @@ describe(`Reporting Job Management Routes: Public`, () => {
registerJobInfoRoutesPublic(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`)
.expect(200)
.expect('Content-Type', 'text/csv; charset=utf-8')
@ -295,7 +292,7 @@ describe(`Reporting Job Management Routes: Public`, () => {
registerJobInfoRoutesPublic(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.delete(`${PUBLIC_ROUTES.JOBS.DELETE_PREFIX}/dank`)
.expect(200)
.expect('Content-Type', 'application/json; charset=utf-8');
@ -312,7 +309,7 @@ describe(`Reporting Job Management Routes: Public`, () => {
registerJobInfoRoutesPublic(reportingCore);
await server.start();
await supertest(httpSetup.server.listener).get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`);
await supertest(server.listener).get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`);
expect(eventTracker.downloadReport).toHaveBeenCalledTimes(1);
});
@ -333,7 +330,7 @@ describe(`Reporting Job Management Routes: Public`, () => {
registerJobInfoRoutesPublic(reportingCore);
await server.start();
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.delete(`${PUBLIC_ROUTES.JOBS.DELETE_PREFIX}/dank`)
.expect(200)
.expect('Content-Type', 'application/json; charset=utf-8');

View file

@ -7,13 +7,12 @@
import { of, throwError } from 'rxjs';
import supertest from 'supertest';
import { setupServer } from '@kbn/core-test-helpers-test-utils';
import { setupServer, SetupServerReturn } from '@kbn/core-test-helpers-test-utils';
import { GlobalSearchResult, GlobalSearchBatchedResults } from '../../../common/types';
import { GlobalSearchFindError } from '../../../common/errors';
import { globalSearchPluginMock } from '../../mocks';
import { registerInternalFindRoute } from '../find';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const pluginId = Symbol('globalSearch');
const createResult = (id: string): GlobalSearchResult => ({
@ -32,21 +31,22 @@ const expectedResults = (...ids: string[]) => ids.map((id) => expect.objectConta
describe('POST /internal/global_search/find', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let registerRouteHandlerContext: SetupServerReturn['registerRouteHandlerContext'];
let globalSearchHandlerContext: ReturnType<
typeof globalSearchPluginMock.createRouteHandlerContext
>;
beforeEach(async () => {
({ server, httpSetup } = await setupServer(pluginId));
({ server, createRouter, registerRouteHandlerContext } = await setupServer(pluginId));
globalSearchHandlerContext = globalSearchPluginMock.createRouteHandlerContext();
httpSetup.registerRouteHandlerContext<
registerRouteHandlerContext<
ReturnType<typeof globalSearchPluginMock.createRequestHandlerContext>,
'globalSearch'
>(pluginId, 'globalSearch', () => globalSearchHandlerContext);
const router = httpSetup.createRouter<any>('/');
const router = createRouter<any>('/');
registerInternalFindRoute(router);
@ -58,7 +58,7 @@ describe('POST /internal/global_search/find', () => {
});
it('calls the handler context with correct parameters', async () => {
await supertest(httpSetup.server.listener)
await supertest(server.listener)
.post('/internal/global_search/find')
.send({
params: {
@ -86,7 +86,7 @@ describe('POST /internal/global_search/find', () => {
of(createBatch('1', '2'), createBatch('3', '4'))
);
const response = await supertest(httpSetup.server.listener)
const response = await supertest(server.listener)
.post('/internal/global_search/find')
.send({
params: {
@ -105,7 +105,7 @@ describe('POST /internal/global_search/find', () => {
throwError(GlobalSearchFindError.invalidLicense('invalid-license-message'))
);
const response = await supertest(httpSetup.server.listener)
const response = await supertest(server.listener)
.post('/internal/global_search/find')
.send({
params: {
@ -125,7 +125,7 @@ describe('POST /internal/global_search/find', () => {
it('returns the default error when the observable throws any other error', async () => {
globalSearchHandlerContext.find.mockReturnValue(throwError('any-error'));
const response = await supertest(httpSetup.server.listener)
const response = await supertest(server.listener)
.post('/internal/global_search/find')
.send({
params: {

View file

@ -6,33 +6,31 @@
*/
import supertest from 'supertest';
import { setupServer } from '@kbn/core-test-helpers-test-utils';
import { setupServer, SetupServerReturn } from '@kbn/core-test-helpers-test-utils';
import { globalSearchPluginMock } from '../../mocks';
import { registerInternalSearchableTypesRoute } from '../get_searchable_types';
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
const pluginId = Symbol('globalSearch');
describe('GET /internal/global_search/searchable_types', () => {
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];
let createRouter: SetupServerReturn['createRouter'];
let registerRouteHandlerContext: SetupServerReturn['registerRouteHandlerContext'];
let globalSearchHandlerContext: ReturnType<
typeof globalSearchPluginMock.createRouteHandlerContext
>;
beforeEach(async () => {
({ server, httpSetup } = await setupServer(pluginId));
({ server, createRouter, registerRouteHandlerContext } = await setupServer(pluginId));
globalSearchHandlerContext = globalSearchPluginMock.createRouteHandlerContext();
httpSetup.registerRouteHandlerContext<
registerRouteHandlerContext<
ReturnType<typeof globalSearchPluginMock.createRequestHandlerContext>,
'globalSearch'
>(pluginId, 'globalSearch', () => globalSearchHandlerContext);
const router =
httpSetup.createRouter<ReturnType<typeof globalSearchPluginMock.createRequestHandlerContext>>(
'/'
);
createRouter<ReturnType<typeof globalSearchPluginMock.createRequestHandlerContext>>('/');
registerInternalSearchableTypesRoute(router);
@ -44,9 +42,7 @@ describe('GET /internal/global_search/searchable_types', () => {
});
it('calls the handler context with correct parameters', async () => {
await supertest(httpSetup.server.listener)
.get('/internal/global_search/searchable_types')
.expect(200);
await supertest(server.listener).get('/internal/global_search/searchable_types').expect(200);
expect(globalSearchHandlerContext.getSearchableTypes).toHaveBeenCalledTimes(1);
});
@ -54,7 +50,7 @@ describe('GET /internal/global_search/searchable_types', () => {
it('returns the types returned from the service', async () => {
globalSearchHandlerContext.getSearchableTypes.mockResolvedValue(['type-a', 'type-b']);
const response = await supertest(httpSetup.server.listener)
const response = await supertest(server.listener)
.get('/internal/global_search/searchable_types')
.expect(200);
@ -66,7 +62,7 @@ describe('GET /internal/global_search/searchable_types', () => {
it('returns the default error when the observable throws any other error', async () => {
globalSearchHandlerContext.getSearchableTypes.mockRejectedValue(new Error());
const response = await supertest(httpSetup.server.listener)
const response = await supertest(server.listener)
.get('/internal/global_search/searchable_types')
.expect(500);

View file

@ -5,7 +5,6 @@
* 2.0.
*/
import { setTimeout as setTimeoutPromise } from 'timers/promises';
import { contextServiceMock, executionContextServiceMock } from '@kbn/core/server/mocks';
import { createHttpService } from '@kbn/core-http-server-mocks';
import type { ElasticsearchClient, KibanaRequest } from '@kbn/core/server';
import type { estypes } from '@elastic/elasticsearch';
@ -37,13 +36,8 @@ describe('APMEventClient', () => {
});
it('cancels a search when a request is aborted', async () => {
await server.preboot({
context: contextServiceMock.createPrebootContract(),
});
const { server: innerServer, createRouter } = await server.setup({
context: contextServiceMock.createSetupContract(),
executionContext: executionContextServiceMock.createInternalSetupContract(),
});
await server.preboot();
const { server: innerServer, createRouter } = await server.setup();
const router = createRouter('/');
let abortSignal: AbortSignal | undefined;