From 2c06ccc34f3e6ca5402f77b3f22d7f00346c8587 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Tue, 12 Apr 2022 16:02:17 -0400 Subject: [PATCH 01/33] feat(core): Introduce seperate client options --- packages/core/src/options.ts | 34 ++++++++ packages/types/src/index.ts | 2 +- packages/types/src/options.ts | 157 ++++++++++++++++++++-------------- packages/utils/src/dsn.ts | 2 - 4 files changed, 126 insertions(+), 69 deletions(-) create mode 100644 packages/core/src/options.ts diff --git a/packages/core/src/options.ts b/packages/core/src/options.ts new file mode 100644 index 000000000000..38cfb65575cc --- /dev/null +++ b/packages/core/src/options.ts @@ -0,0 +1,34 @@ +import { ClientOptions, Options } from '@sentry/types'; +import { makeDsn, stackParserFromOptions } from '@sentry/utils'; + +import { getIntegrationsToSetup } from './integration'; +import { NoopTransport } from './transports/noop'; + +export const DEFAULT_MAX_BREADCRUMBS = 100; +export const DEFAULT_SAMPLE_RATE = 1; +export const DEFAULT_MAX_VALUE_LENGTH = 250; +export const DEFAULT_NORMALIZE_DEPTH = 3; +export const DEFAULT_NORMALIZE_MAX_BREADTH = 1000; +export const DEFAULT_SHUTDOWN_TIMEOUT = 2000; + +export const defaultCoreOptions = { + maxBreadcrumbs: DEFAULT_MAX_BREADCRUMBS, + sampleRate: DEFAULT_SAMPLE_RATE, + maxValueLength: DEFAULT_MAX_VALUE_LENGTH, + normalizeDepth: DEFAULT_NORMALIZE_DEPTH, + normalizeMaxBreadth: DEFAULT_NORMALIZE_MAX_BREADTH, + shutdownTimeout: DEFAULT_SHUTDOWN_TIMEOUT, +}; + +/** JSDoc */ +export function optionsToClientOptions(options: Options): ClientOptions { + return { + // TODO(v7): Remove NoopTransport + transport: options.transport || NoopTransport, + ...defaultCoreOptions, + ...options, + dsn: options.dsn === undefined ? undefined : makeDsn(options.dsn), + stackParser: stackParserFromOptions(options), + integrations: getIntegrationsToSetup(options), + }; +} diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 84430c1d3976..5fe4ced6375b 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -27,7 +27,7 @@ export type { Hub } from './hub'; export type { Integration, IntegrationClass } from './integration'; export type { Mechanism } from './mechanism'; export type { ExtractedNodeRequestData, Primitive, WorkerLocation } from './misc'; -export type { Options } from './options'; +export type { ClientOptions, Options } from './options'; export type { Package } from './package'; export type { QueryParams, Request, SentryRequest, SentryRequestType } from './request'; export type { Response } from './response'; diff --git a/packages/types/src/options.ts b/packages/types/src/options.ts index a7306acdd76f..fa4b9fb4eb5b 100644 --- a/packages/types/src/options.ts +++ b/packages/types/src/options.ts @@ -1,4 +1,5 @@ import { Breadcrumb, BreadcrumbHint } from './breadcrumb'; +import { DsnComponents } from './dsn'; import { Event, EventHint } from './event'; import { Integration } from './integration'; import { CaptureContext } from './scope'; @@ -7,8 +8,7 @@ import { StackLineParser, StackParser } from './stacktrace'; import { SamplingContext } from './transaction'; import { Transport, TransportClass, TransportOptions } from './transport'; -/** Base configuration options for every SDK. */ -export interface Options { +export interface ClientOptions { /** * Enable debug functionality in the SDK itself */ @@ -20,36 +20,55 @@ export interface Options { */ enabled?: boolean; + /** Attaches stacktraces to pure capture message / log integrations */ + attachStacktrace?: boolean; + + /** + * A flag enabling Sessions Tracking feature. + * By default, Sessions Tracking is enabled. + */ + autoSessionTracking?: boolean; + + /** + * Send SDK Client Reports. + * By default, Client Reports are enabled. + */ + sendClientReports?: boolean; + /** * The Dsn used to connect to Sentry and identify the project. If omitted, the * SDK will not send any data to Sentry. */ - dsn?: string; + dsn?: DsnComponents; /** - * If this is set to false, default integrations will not be added, otherwise this will internally be set to the - * recommended default integrations. - * TODO: We should consider changing this to `boolean | Integration[]` + * The release identifier used when uploading respective source maps. Specify + * this value to allow Sentry to resolve the correct source maps when + * processing events. */ - defaultIntegrations?: false | Integration[]; + release?: string; + + /** The current environment of your application (e.g. "production"). */ + environment?: string; + + /** Sets the distribution for all events */ + dist?: string; /** * List of integrations that should be installed after SDK was initialized. - * Accepts either a list of integrations or a function that receives - * default integrations and returns a new, updated list. */ - integrations?: Integration[] | ((integrations: Integration[]) => Integration[]); + integrations: Integration[]; /** - * A pattern for error messages which should not be sent to Sentry. - * By default, all errors will be sent. + * Transport object that should be used to send events to Sentry */ - ignoreErrors?: Array; + transport: TransportClass; /** - * Transport object that should be used to send events to Sentry + * A stack parser implementation + * By default, a stack parser is supplied for all supported platforms */ - transport?: TransportClass; + stackParser: StackParser; /** * Options for the default transport that the SDK uses. @@ -57,39 +76,32 @@ export interface Options { transportOptions?: TransportOptions; /** - * A URL to an envelope tunnel endpoint. An envelope tunnel is an HTTP endpoint - * that accepts Sentry envelopes for forwarding. This can be used to force data - * through a custom server independent of the type of data. + * Sample rate to determine trace sampling. + * + * 0.0 = 0% chance of a given trace being sent (send no traces) 1.0 = 100% chance of a given trace being sent (send + * all traces) + * + * Tracing is enabled if either this or `tracesSampler` is defined. If both are defined, `tracesSampleRate` is + * ignored. */ - tunnel?: string; + tracesSampleRate?: number; /** - * The release identifier used when uploading respective source maps. Specify - * this value to allow Sentry to resolve the correct source maps when - * processing events. + * Initial data to populate scope. */ - release?: string; - - /** The current environment of your application (e.g. "production"). */ - environment?: string; - - /** Sets the distribution for all events */ - dist?: string; + initialScope?: CaptureContext; /** * The maximum number of breadcrumbs sent with events. Defaults to 100. * Values over 100 will be ignored and 100 used instead. */ - maxBreadcrumbs?: number; + maxBreadcrumbs: number; /** A global sample rate to apply to all events (0 - 1). */ - sampleRate?: number; - - /** Attaches stacktraces to pure capture message / log integrations */ - attachStacktrace?: boolean; + sampleRate: number; /** Maximum number of chars a single value can have before it will be truncated. */ - maxValueLength?: number; + maxValueLength: number; /** * Maximum number of levels that normalization algorithm will traverse in objects and arrays. @@ -100,7 +112,7 @@ export interface Options { * - `extra` * Defaults to `3`. Set to `0` to disable. */ - normalizeDepth?: number; + normalizeDepth: number; /** * Maximum number of properties or elements that the normalization algorithm will output in any single array or object included in the normalized event. @@ -111,7 +123,7 @@ export interface Options { * - `extra` * Defaults to `1000` */ - normalizeMaxBreadth?: number; + normalizeMaxBreadth: number; /** * Controls how many milliseconds to wait before shutting down. The default is @@ -120,41 +132,20 @@ export interface Options { * high can cause the application to block for users with network connectivity * problems. */ - shutdownTimeout?: number; + shutdownTimeout: number; /** - * Sample rate to determine trace sampling. - * - * 0.0 = 0% chance of a given trace being sent (send no traces) 1.0 = 100% chance of a given trace being sent (send - * all traces) - * - * Tracing is enabled if either this or `tracesSampler` is defined. If both are defined, `tracesSampleRate` is - * ignored. - */ - tracesSampleRate?: number; - - /** - * A flag enabling Sessions Tracking feature. - * By default, Sessions Tracking is enabled. - */ - autoSessionTracking?: boolean; - - /** - * Send SDK Client Reports. - * By default, Client Reports are enabled. - */ - sendClientReports?: boolean; - - /** - * Initial data to populate scope. + * A pattern for error messages which should not be sent to Sentry. + * By default, all errors will be sent. */ - initialScope?: CaptureContext; + ignoreErrors?: Array; /** - * A stack parser implementation or an array of stack line parsers - * By default, a stack parser is supplied for all supported browsers + * A URL to an envelope tunnel endpoint. An envelope tunnel is an HTTP endpoint + * that accepts Sentry envelopes for forwarding. This can be used to force data + * through a custom server independent of the type of data. */ - stackParser?: StackParser | StackLineParser[]; + tunnel?: string; /** * Set of metadata about the SDK that can be internally used to enhance envelopes and events, @@ -210,3 +201,37 @@ export interface Options { */ beforeBreadcrumb?: (breadcrumb: Breadcrumb, hint?: BreadcrumbHint) => Breadcrumb | null; } + +/** Base configuration options for every SDK. */ +export interface Options extends Omit, 'dsn' | 'integrations' | 'transport' | 'stackParser'> { + /** + * The Dsn used to connect to Sentry and identify the project. If omitted, the + * SDK will not send any data to Sentry. + */ + dsn?: string; + + /** + * If this is set to false, default integrations will not be added, otherwise this will internally be set to the + * recommended default integrations. + * TODO: We should consider changing this to `boolean | Integration[]` + */ + defaultIntegrations?: false | Integration[]; + + /** + * List of integrations that should be installed after SDK was initialized. + * Accepts either a list of integrations or a function that receives + * default integrations and returns a new, updated list. + */ + integrations?: Integration[] | ((integrations: Integration[]) => Integration[]); + + /** + * Transport object that should be used to send events to Sentry + */ + transport?: TransportClass; + + /** + * A stack parser implementation or an array of stack line parsers + * By default, a stack parser is supplied for all supported browsers + */ + stackParser?: StackParser | StackLineParser[]; +} diff --git a/packages/utils/src/dsn.ts b/packages/utils/src/dsn.ts index 5c500c5ec654..56b864e2863b 100644 --- a/packages/utils/src/dsn.ts +++ b/packages/utils/src/dsn.ts @@ -98,8 +98,6 @@ function validateDsn(dsn: DsnComponents): boolean | void { /** The Sentry Dsn, identifying a Sentry instance and project. */ export function makeDsn(from: DsnLike): DsnComponents { const components = typeof from === 'string' ? dsnFromString(from) : dsnFromComponents(from); - validateDsn(components); - return components; } From 3ad39888c210d8cb6f47c8aad2f8983fd39618fe Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 14 Apr 2022 14:18:38 -0400 Subject: [PATCH 02/33] add client options to baseclient --- packages/core/src/baseclient.ts | 4 ++-- packages/core/src/integration.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/core/src/baseclient.ts b/packages/core/src/baseclient.ts index 2888e9853f5e..3d82d829cead 100644 --- a/packages/core/src/baseclient.ts +++ b/packages/core/src/baseclient.ts @@ -2,12 +2,12 @@ import { Scope, Session } from '@sentry/hub'; import { Client, + ClientOptions, DsnComponents, Event, EventHint, Integration, IntegrationClass, - Options, Severity, SeverityLevel, Transport, @@ -68,7 +68,7 @@ const ALREADY_SEEN_ERROR = "Not capturing exception because it's already been ca * // ... * } */ -export abstract class BaseClient implements Client { +export abstract class BaseClient implements Client { /** Options passed to the SDK. */ protected readonly _options: O; diff --git a/packages/core/src/integration.ts b/packages/core/src/integration.ts index cc694c815289..b4f35e7d5b1e 100644 --- a/packages/core/src/integration.ts +++ b/packages/core/src/integration.ts @@ -1,5 +1,5 @@ import { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub'; -import { Integration, Options } from '@sentry/types'; +import { ClientOptions, Integration, Options } from '@sentry/types'; import { addNonEnumerableProperty, logger } from '@sentry/utils'; import { IS_DEBUG_BUILD } from './flags'; @@ -70,9 +70,9 @@ export function setupIntegration(integration: Integration): void { * @param integrations array of integration instances * @param withDefault should enable default integrations */ -export function setupIntegrations(options: O): IntegrationIndex { +export function setupIntegrations(options: O): IntegrationIndex { const integrations: IntegrationIndex = {}; - getIntegrationsToSetup(options).forEach(integration => { + options.integrations.forEach(integration => { integrations[integration.name] = integration; setupIntegration(integration); }); From 945b10abc56e438c26d1644d57f8d7f2db13c8d8 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 14 Apr 2022 14:20:50 -0400 Subject: [PATCH 03/33] updates types --- packages/types/src/client.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/types/src/client.ts b/packages/types/src/client.ts index c3f2a9920258..f0cdc8b3a988 100644 --- a/packages/types/src/client.ts +++ b/packages/types/src/client.ts @@ -1,7 +1,7 @@ import { DsnComponents } from './dsn'; import { Event, EventHint } from './event'; import { Integration, IntegrationClass } from './integration'; -import { Options } from './options'; +import { ClientOptions } from './options'; import { Scope } from './scope'; import { Session } from './session'; import { Severity, SeverityLevel } from './severity'; @@ -16,7 +16,7 @@ import { Transport } from './transport'; * there will only be one instance during runtime. * */ -export interface Client { +export interface Client { /** * Captures an exception event and sends it to Sentry. * From d0d03c9c9ebc66c80d17c925bb133b5e653e6452 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 14 Apr 2022 14:28:54 -0400 Subject: [PATCH 04/33] introduce diff option types --- packages/node/src/client.ts | 6 +++--- packages/node/src/transports/setup.ts | 4 ++-- packages/node/src/types.ts | 19 ++++++++++--------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/node/src/client.ts b/packages/node/src/client.ts index e660c6c7b421..9de06fe4f07d 100644 --- a/packages/node/src/client.ts +++ b/packages/node/src/client.ts @@ -5,7 +5,7 @@ import { logger, resolvedSyncPromise, stackParserFromOptions } from '@sentry/uti import { eventFromMessage, eventFromUnknownInput } from './eventbuilder'; import { IS_DEBUG_BUILD } from './flags'; -import { NodeOptions } from './types'; +import { NodeClientOptions } from './types'; /** * The Sentry Node SDK Client. @@ -13,14 +13,14 @@ import { NodeOptions } from './types'; * @see NodeOptions for documentation on configuration options. * @see SentryClient for usage documentation. */ -export class NodeClient extends BaseClient { +export class NodeClient extends BaseClient { protected _sessionFlusher: SessionFlusher | undefined; /** * Creates a new Node SDK instance. * @param options Configuration options for this SDK. */ - public constructor(options: NodeOptions, transport: Transport, newTransport?: NewTransport) { + public constructor(options: NodeClientOptions, transport: Transport, newTransport?: NewTransport) { options._metadata = options._metadata || {}; options._metadata.sdk = options._metadata.sdk || { name: 'sentry.javascript.node', diff --git a/packages/node/src/transports/setup.ts b/packages/node/src/transports/setup.ts index 2cffd2d43ecd..ccd97da82961 100644 --- a/packages/node/src/transports/setup.ts +++ b/packages/node/src/transports/setup.ts @@ -2,7 +2,7 @@ import { getEnvelopeEndpointWithUrlEncodedAuth, initAPIDetails, NewTransport, No import { Transport, TransportOptions } from '@sentry/types'; import { makeDsn } from '@sentry/utils'; -import { NodeOptions } from '../types'; +import { NodeClientOptions } from '../types'; import { HTTPSTransport, HTTPTransport, makeNodeTransport } from '.'; /** @@ -13,7 +13,7 @@ import { HTTPSTransport, HTTPTransport, makeNodeTransport } from '.'; * this function will return a ready to use `NewTransport`. */ // TODO(v7): Adjust return value when NewTransport is the default -export function setupNodeTransport(options: NodeOptions): { transport: Transport; newTransport?: NewTransport } { +export function setupNodeTransport(options: NodeClientOptions): { transport: Transport; newTransport?: NewTransport } { if (!options.dsn) { // We return the noop transport here in case there is no Dsn. return { transport: new NoopTransport() }; diff --git a/packages/node/src/types.ts b/packages/node/src/types.ts index 055006a47e9e..66860f02f0ca 100644 --- a/packages/node/src/types.ts +++ b/packages/node/src/types.ts @@ -1,16 +1,9 @@ -import { Options } from '@sentry/types'; +import { ClientOptions, Options } from '@sentry/types'; -/** - * Configuration options for the Sentry Node SDK. - * @see NodeClient for more information. - */ -export interface NodeOptions extends Options { +export interface BaseNodeOptions { /** Sets an optional server name (device name) */ serverName?: string; - /** Maximum time in milliseconds to wait to drain the request queue, before the process is allowed to exit. */ - shutdownTimeout?: number; - /** Set a HTTP proxy that should be used for outbound requests. */ httpProxy?: string; @@ -23,3 +16,11 @@ export interface NodeOptions extends Options { /** Callback that is executed when a fatal global error occurs. */ onFatalError?(error: Error): void; } + +export interface NodeOptions extends Options, BaseNodeOptions {} + +/** + * Configuration options for the Sentry Node SDK. + * @see NodeClient for more information. + */ +export interface NodeClientOptions extends ClientOptions, BaseNodeOptions {} From 23d16a05b4ca55b7bdafa1e24d7d9596d16aca4d Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 14 Apr 2022 14:29:01 -0400 Subject: [PATCH 05/33] introduce diff browser types: --- packages/browser/src/client.ts | 21 ++++++++++++--------- packages/browser/src/transports/setup.ts | 7 +++++-- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/packages/browser/src/client.ts b/packages/browser/src/client.ts index 8666eaebe8d5..c80f6a5980c8 100644 --- a/packages/browser/src/client.ts +++ b/packages/browser/src/client.ts @@ -1,5 +1,5 @@ import { BaseClient, NewTransport, Scope, SDK_VERSION } from '@sentry/core'; -import { Event, EventHint, Options, Severity, SeverityLevel, Transport } from '@sentry/types'; +import { ClientOptions, Event, EventHint, Options, Severity, SeverityLevel, Transport } from '@sentry/types'; import { getGlobalObject, logger, stackParserFromOptions } from '@sentry/utils'; import { eventFromException, eventFromMessage } from './eventbuilder'; @@ -7,11 +7,7 @@ import { IS_DEBUG_BUILD } from './flags'; import { injectReportDialog, ReportDialogOptions } from './helpers'; import { Breadcrumbs } from './integrations'; -/** - * Configuration options for the Sentry Browser SDK. - * @see BrowserClient for more information. - */ -export interface BrowserOptions extends Options { +export interface BaseBrowserOptions { /** * A pattern for error URLs which should exclusively be sent to Sentry. * This is the opposite of {@link Options.denyUrls}. @@ -27,19 +23,27 @@ export interface BrowserOptions extends Options { denyUrls?: Array; } +export interface BrowserOptions extends Options, BaseBrowserOptions {} + +/** + * Configuration options for the Sentry Browser SDK. + * @see BrowserClient for more information. + */ +export interface BrowserClientOptions extends ClientOptions, BaseBrowserOptions {} + /** * The Sentry Browser SDK Client. * * @see BrowserOptions for documentation on configuration options. * @see SentryClient for usage documentation. */ -export class BrowserClient extends BaseClient { +export class BrowserClient extends BaseClient { /** * Creates a new Browser SDK instance. * * @param options Configuration options for this SDK. */ - public constructor(options: BrowserOptions = {}, transport: Transport, newTransport?: NewTransport) { + public constructor(options: BrowserClientOptions, transport: Transport, newTransport?: NewTransport) { options._metadata = options._metadata || {}; options._metadata.sdk = options._metadata.sdk || { name: 'sentry.javascript.browser', @@ -51,7 +55,6 @@ export class BrowserClient extends BaseClient { ], version: SDK_VERSION, }; - super(options, transport, newTransport); } diff --git a/packages/browser/src/transports/setup.ts b/packages/browser/src/transports/setup.ts index 0af6aad90676..c8282b333ad6 100644 --- a/packages/browser/src/transports/setup.ts +++ b/packages/browser/src/transports/setup.ts @@ -8,7 +8,7 @@ import { import { Transport, TransportOptions } from '@sentry/types'; import { supportsFetch } from '@sentry/utils'; -import { BrowserOptions } from '../client'; +import { BrowserClientOptions } from '../client'; import { FetchTransport } from './fetch'; import { makeNewFetchTransport } from './new-fetch'; import { makeNewXHRTransport } from './new-xhr'; @@ -31,7 +31,10 @@ export interface BrowserTransportOptions extends BaseTransportOptions { * this function will return a ready to use `NewTransport`. */ // TODO(v7): Adjust return value when NewTransport is the default -export function setupBrowserTransport(options: BrowserOptions): { transport: Transport; newTransport?: NewTransport } { +export function setupBrowserTransport(options: BrowserClientOptions): { + transport: Transport; + newTransport?: NewTransport; +} { if (!options.dsn) { // We return the noop transport here in case there is no Dsn. return { transport: new NoopTransport() }; From 916749382a02330debfec49131c4aea5bc782860 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 14 Apr 2022 14:53:49 -0400 Subject: [PATCH 06/33] node client options --- packages/core/src/index.ts | 1 + packages/core/src/sdk.ts | 6 +++--- packages/node/src/sdk.ts | 20 ++++++++++++++++---- packages/node/src/transports/setup.ts | 4 ++-- packages/types/src/options.ts | 2 +- 5 files changed, 23 insertions(+), 10 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index ccf2aa519775..f8b193a4477b 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -37,6 +37,7 @@ export { initAndBind } from './sdk'; export { NoopTransport } from './transports/noop'; export { createTransport } from './transports/base'; export { SDK_VERSION } from './version'; +export { defaultCoreOptions, optionsToClientOptions } from './options'; import * as Integrations from './integrations'; diff --git a/packages/core/src/sdk.ts b/packages/core/src/sdk.ts index 97c8b349a235..c7f7bb4916a3 100644 --- a/packages/core/src/sdk.ts +++ b/packages/core/src/sdk.ts @@ -1,12 +1,12 @@ import { getCurrentHub } from '@sentry/hub'; -import { Client, Options, Transport } from '@sentry/types'; +import { Client, ClientOptions, Transport } from '@sentry/types'; import { logger } from '@sentry/utils'; import { IS_DEBUG_BUILD } from './flags'; import { NewTransport } from './transports/base'; /** A class object that can instantiate Client objects. */ -export type ClientClass = new ( +export type ClientClass = new ( options: O, transport: Transport, newTransport?: NewTransport, @@ -19,7 +19,7 @@ export type ClientClass = new ( * @param clientClass The client class to instantiate. * @param options Options to pass to the client. */ -export function initAndBind( +export function initAndBind( clientClass: ClientClass, options: O, transport: Transport, diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts index 0b7fb9bd5671..85c10f7eeb3c 100644 --- a/packages/node/src/sdk.ts +++ b/packages/node/src/sdk.ts @@ -1,7 +1,8 @@ -import { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core'; +import { defaultCoreOptions, getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core'; +import { getIntegrationsToSetup } from '@sentry/core/build/types/integration'; import { getMainCarrier, setHubOnCarrier } from '@sentry/hub'; import { SessionStatus } from '@sentry/types'; -import { getGlobalObject, logger } from '@sentry/utils'; +import { getGlobalObject, logger, makeDsn, stackParserFromOptions } from '@sentry/utils'; import * as domain from 'domain'; import { NodeClient } from './client'; @@ -9,7 +10,7 @@ import { IS_DEBUG_BUILD } from './flags'; import { Console, ContextLines, Http, LinkedErrors, OnUncaughtException, OnUnhandledRejection } from './integrations'; import { nodeStackParser } from './stack-parser'; import { setupNodeTransport } from './transports'; -import { NodeOptions } from './types'; +import { NodeClientOptions, NodeOptions } from './types'; export const defaultIntegrations = [ // Common @@ -132,7 +133,18 @@ export function init(options: NodeOptions = {}): void { } const { transport, newTransport } = setupNodeTransport(options); - initAndBind(NodeClient, options, transport, newTransport); + + // TODO(v7): Refactor this to reduce the logic above + const clientOptions: NodeClientOptions = { + ...options, + ...defaultCoreOptions, + dsn: options.dsn === undefined ? undefined : makeDsn(process.env.SENTRY_DSN ? process.env.SENTRY_DSN : options.dsn), + stackParser: stackParserFromOptions(options), + integrations: getIntegrationsToSetup(options), + transport, + }; + + initAndBind(NodeClient, clientOptions, transport, newTransport); if (options.autoSessionTracking) { startSessionTracking(); diff --git a/packages/node/src/transports/setup.ts b/packages/node/src/transports/setup.ts index ccd97da82961..2cffd2d43ecd 100644 --- a/packages/node/src/transports/setup.ts +++ b/packages/node/src/transports/setup.ts @@ -2,7 +2,7 @@ import { getEnvelopeEndpointWithUrlEncodedAuth, initAPIDetails, NewTransport, No import { Transport, TransportOptions } from '@sentry/types'; import { makeDsn } from '@sentry/utils'; -import { NodeClientOptions } from '../types'; +import { NodeOptions } from '../types'; import { HTTPSTransport, HTTPTransport, makeNodeTransport } from '.'; /** @@ -13,7 +13,7 @@ import { HTTPSTransport, HTTPTransport, makeNodeTransport } from '.'; * this function will return a ready to use `NewTransport`. */ // TODO(v7): Adjust return value when NewTransport is the default -export function setupNodeTransport(options: NodeClientOptions): { transport: Transport; newTransport?: NewTransport } { +export function setupNodeTransport(options: NodeOptions): { transport: Transport; newTransport?: NewTransport } { if (!options.dsn) { // We return the noop transport here in case there is no Dsn. return { transport: new NoopTransport() }; diff --git a/packages/types/src/options.ts b/packages/types/src/options.ts index fa4b9fb4eb5b..f9073d002e5c 100644 --- a/packages/types/src/options.ts +++ b/packages/types/src/options.ts @@ -227,7 +227,7 @@ export interface Options extends Omit, 'dsn' | 'integrati /** * Transport object that should be used to send events to Sentry */ - transport?: TransportClass; + transport?: Transport; /** * A stack parser implementation or an array of stack line parsers From 61a26ddc2a473d57af3946cff2cb6fd8dabeec4a Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 14 Apr 2022 15:04:47 -0400 Subject: [PATCH 07/33] switch browser --- packages/browser/src/sdk.ts | 27 +++++++++++++++++++----- packages/browser/src/transports/setup.ts | 4 ++-- packages/core/src/options.ts | 19 ----------------- packages/node/src/sdk.ts | 2 +- packages/types/src/options.ts | 4 ++-- 5 files changed, 27 insertions(+), 29 deletions(-) diff --git a/packages/browser/src/sdk.ts b/packages/browser/src/sdk.ts index 94ec87cb4279..552abfe56371 100644 --- a/packages/browser/src/sdk.ts +++ b/packages/browser/src/sdk.ts @@ -1,8 +1,16 @@ -import { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core'; +import { defaultCoreOptions, getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core'; +import { getIntegrationsToSetup } from '@sentry/core/build/types/integration'; import { Hub } from '@sentry/types'; -import { addInstrumentationHandler, getGlobalObject, logger, resolvedSyncPromise } from '@sentry/utils'; +import { + addInstrumentationHandler, + getGlobalObject, + logger, + makeDsn, + resolvedSyncPromise, + stackParserFromOptions, +} from '@sentry/utils'; -import { BrowserClient, BrowserOptions } from './client'; +import { BrowserClient, BrowserClientOptions, BrowserOptions } from './client'; import { IS_DEBUG_BUILD } from './flags'; import { ReportDialogOptions, wrap as internalWrap } from './helpers'; import { Breadcrumbs, Dedupe, GlobalHandlers, LinkedErrors, TryCatch, UserAgent } from './integrations'; @@ -97,9 +105,18 @@ export function init(options: BrowserOptions = {}): void { if (options.stackParser === undefined) { options.stackParser = defaultStackParsers; } - const { transport, newTransport } = setupBrowserTransport(options); - initAndBind(BrowserClient, options, transport, newTransport); + + const clientOptions: BrowserClientOptions = { + ...options, + ...defaultCoreOptions, + dsn: options.dsn === undefined ? undefined : makeDsn(options.dsn), + stackParser: stackParserFromOptions(options), + integrations: getIntegrationsToSetup(options), + transport, + }; + + initAndBind(BrowserClient, clientOptions, transport, newTransport); if (options.autoSessionTracking) { startSessionTracking(); diff --git a/packages/browser/src/transports/setup.ts b/packages/browser/src/transports/setup.ts index c8282b333ad6..f72365e7dc94 100644 --- a/packages/browser/src/transports/setup.ts +++ b/packages/browser/src/transports/setup.ts @@ -8,7 +8,7 @@ import { import { Transport, TransportOptions } from '@sentry/types'; import { supportsFetch } from '@sentry/utils'; -import { BrowserClientOptions } from '../client'; +import { BrowserOptions } from '../client'; import { FetchTransport } from './fetch'; import { makeNewFetchTransport } from './new-fetch'; import { makeNewXHRTransport } from './new-xhr'; @@ -31,7 +31,7 @@ export interface BrowserTransportOptions extends BaseTransportOptions { * this function will return a ready to use `NewTransport`. */ // TODO(v7): Adjust return value when NewTransport is the default -export function setupBrowserTransport(options: BrowserClientOptions): { +export function setupBrowserTransport(options: BrowserOptions): { transport: Transport; newTransport?: NewTransport; } { diff --git a/packages/core/src/options.ts b/packages/core/src/options.ts index 38cfb65575cc..dea56af39c32 100644 --- a/packages/core/src/options.ts +++ b/packages/core/src/options.ts @@ -1,9 +1,3 @@ -import { ClientOptions, Options } from '@sentry/types'; -import { makeDsn, stackParserFromOptions } from '@sentry/utils'; - -import { getIntegrationsToSetup } from './integration'; -import { NoopTransport } from './transports/noop'; - export const DEFAULT_MAX_BREADCRUMBS = 100; export const DEFAULT_SAMPLE_RATE = 1; export const DEFAULT_MAX_VALUE_LENGTH = 250; @@ -19,16 +13,3 @@ export const defaultCoreOptions = { normalizeMaxBreadth: DEFAULT_NORMALIZE_MAX_BREADTH, shutdownTimeout: DEFAULT_SHUTDOWN_TIMEOUT, }; - -/** JSDoc */ -export function optionsToClientOptions(options: Options): ClientOptions { - return { - // TODO(v7): Remove NoopTransport - transport: options.transport || NoopTransport, - ...defaultCoreOptions, - ...options, - dsn: options.dsn === undefined ? undefined : makeDsn(options.dsn), - stackParser: stackParserFromOptions(options), - integrations: getIntegrationsToSetup(options), - }; -} diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts index 85c10f7eeb3c..5c633f8c40d0 100644 --- a/packages/node/src/sdk.ts +++ b/packages/node/src/sdk.ts @@ -201,7 +201,7 @@ export function isAutoSessionTrackingEnabled(client?: NodeClient): boolean { if (client === undefined) { return false; } - const clientOptions: NodeOptions = client && client.getOptions(); + const clientOptions: NodeClientOptions = client && client.getOptions(); if (clientOptions && clientOptions.autoSessionTracking !== undefined) { return clientOptions.autoSessionTracking; } diff --git a/packages/types/src/options.ts b/packages/types/src/options.ts index f9073d002e5c..abc50e5a58ce 100644 --- a/packages/types/src/options.ts +++ b/packages/types/src/options.ts @@ -62,7 +62,7 @@ export interface ClientOptions { /** * Transport object that should be used to send events to Sentry */ - transport: TransportClass; + transport: Transport; /** * A stack parser implementation @@ -227,7 +227,7 @@ export interface Options extends Omit, 'dsn' | 'integrati /** * Transport object that should be used to send events to Sentry */ - transport?: Transport; + transport?: TransportClass; /** * A stack parser implementation or an array of stack line parsers From b411f021b49f9e48560b19a609281d8b839b7fe0 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 14 Apr 2022 15:09:01 -0400 Subject: [PATCH 08/33] don't do anything with the dsn --- packages/browser/src/sdk.ts | 1 - packages/node/src/sdk.ts | 1 - packages/types/src/options.ts | 10 ++-------- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/packages/browser/src/sdk.ts b/packages/browser/src/sdk.ts index 552abfe56371..3d357f23e4f8 100644 --- a/packages/browser/src/sdk.ts +++ b/packages/browser/src/sdk.ts @@ -110,7 +110,6 @@ export function init(options: BrowserOptions = {}): void { const clientOptions: BrowserClientOptions = { ...options, ...defaultCoreOptions, - dsn: options.dsn === undefined ? undefined : makeDsn(options.dsn), stackParser: stackParserFromOptions(options), integrations: getIntegrationsToSetup(options), transport, diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts index 5c633f8c40d0..172aa975a304 100644 --- a/packages/node/src/sdk.ts +++ b/packages/node/src/sdk.ts @@ -138,7 +138,6 @@ export function init(options: NodeOptions = {}): void { const clientOptions: NodeClientOptions = { ...options, ...defaultCoreOptions, - dsn: options.dsn === undefined ? undefined : makeDsn(process.env.SENTRY_DSN ? process.env.SENTRY_DSN : options.dsn), stackParser: stackParserFromOptions(options), integrations: getIntegrationsToSetup(options), transport, diff --git a/packages/types/src/options.ts b/packages/types/src/options.ts index abc50e5a58ce..c8e627979abe 100644 --- a/packages/types/src/options.ts +++ b/packages/types/src/options.ts @@ -39,7 +39,7 @@ export interface ClientOptions { * The Dsn used to connect to Sentry and identify the project. If omitted, the * SDK will not send any data to Sentry. */ - dsn?: DsnComponents; + dsn?: string; /** * The release identifier used when uploading respective source maps. Specify @@ -203,13 +203,7 @@ export interface ClientOptions { } /** Base configuration options for every SDK. */ -export interface Options extends Omit, 'dsn' | 'integrations' | 'transport' | 'stackParser'> { - /** - * The Dsn used to connect to Sentry and identify the project. If omitted, the - * SDK will not send any data to Sentry. - */ - dsn?: string; - +export interface Options extends Omit, 'integrations' | 'transport' | 'stackParser'> { /** * If this is set to false, default integrations will not be added, otherwise this will internally be set to the * recommended default integrations. From f6d09ab1110c2f664a035a621619815cd6b0bc03 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 14 Apr 2022 15:13:40 -0400 Subject: [PATCH 09/33] dsn type fix --- packages/types/src/options.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/types/src/options.ts b/packages/types/src/options.ts index c8e627979abe..2fd9315d42eb 100644 --- a/packages/types/src/options.ts +++ b/packages/types/src/options.ts @@ -1,5 +1,4 @@ import { Breadcrumb, BreadcrumbHint } from './breadcrumb'; -import { DsnComponents } from './dsn'; import { Event, EventHint } from './event'; import { Integration } from './integration'; import { CaptureContext } from './scope'; From 698a8f7ceb06bb52e760b11fd9e8fa5950d7db23 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 14 Apr 2022 15:38:11 -0400 Subject: [PATCH 10/33] fix export --- packages/core/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index f8b193a4477b..4e93502766b5 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -37,7 +37,7 @@ export { initAndBind } from './sdk'; export { NoopTransport } from './transports/noop'; export { createTransport } from './transports/base'; export { SDK_VERSION } from './version'; -export { defaultCoreOptions, optionsToClientOptions } from './options'; +export { defaultCoreOptions } from './options'; import * as Integrations from './integrations'; From 0256a7b87aaf5fc21f07a51976aaf2f6111648ed Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 14 Apr 2022 15:54:38 -0400 Subject: [PATCH 11/33] make dsn --- packages/browser/src/sdk.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/browser/src/sdk.ts b/packages/browser/src/sdk.ts index 3d357f23e4f8..3827a6607111 100644 --- a/packages/browser/src/sdk.ts +++ b/packages/browser/src/sdk.ts @@ -5,7 +5,6 @@ import { addInstrumentationHandler, getGlobalObject, logger, - makeDsn, resolvedSyncPromise, stackParserFromOptions, } from '@sentry/utils'; From e8335f279798a5e8779b52dfc25fc531645d43e6 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 14 Apr 2022 16:05:53 -0400 Subject: [PATCH 12/33] missing import --- packages/node/src/sdk.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts index 172aa975a304..baa7b9ff506e 100644 --- a/packages/node/src/sdk.ts +++ b/packages/node/src/sdk.ts @@ -2,7 +2,7 @@ import { defaultCoreOptions, getCurrentHub, initAndBind, Integrations as CoreInt import { getIntegrationsToSetup } from '@sentry/core/build/types/integration'; import { getMainCarrier, setHubOnCarrier } from '@sentry/hub'; import { SessionStatus } from '@sentry/types'; -import { getGlobalObject, logger, makeDsn, stackParserFromOptions } from '@sentry/utils'; +import { getGlobalObject, logger, stackParserFromOptions } from '@sentry/utils'; import * as domain from 'domain'; import { NodeClient } from './client'; From 5b4eec962abc83ca30f26213be73b1f552143137 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 18 Apr 2022 09:59:15 -0400 Subject: [PATCH 13/33] remove default core options --- packages/browser/src/sdk.ts | 3 +-- packages/core/src/index.ts | 1 - packages/core/src/options.ts | 15 --------------- packages/node/src/sdk.ts | 3 +-- packages/types/src/options.ts | 12 ++++++------ 5 files changed, 8 insertions(+), 26 deletions(-) delete mode 100644 packages/core/src/options.ts diff --git a/packages/browser/src/sdk.ts b/packages/browser/src/sdk.ts index 3827a6607111..209ec27d55ef 100644 --- a/packages/browser/src/sdk.ts +++ b/packages/browser/src/sdk.ts @@ -1,4 +1,4 @@ -import { defaultCoreOptions, getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core'; +import { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core'; import { getIntegrationsToSetup } from '@sentry/core/build/types/integration'; import { Hub } from '@sentry/types'; import { @@ -108,7 +108,6 @@ export function init(options: BrowserOptions = {}): void { const clientOptions: BrowserClientOptions = { ...options, - ...defaultCoreOptions, stackParser: stackParserFromOptions(options), integrations: getIntegrationsToSetup(options), transport, diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 4e93502766b5..ccf2aa519775 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -37,7 +37,6 @@ export { initAndBind } from './sdk'; export { NoopTransport } from './transports/noop'; export { createTransport } from './transports/base'; export { SDK_VERSION } from './version'; -export { defaultCoreOptions } from './options'; import * as Integrations from './integrations'; diff --git a/packages/core/src/options.ts b/packages/core/src/options.ts deleted file mode 100644 index dea56af39c32..000000000000 --- a/packages/core/src/options.ts +++ /dev/null @@ -1,15 +0,0 @@ -export const DEFAULT_MAX_BREADCRUMBS = 100; -export const DEFAULT_SAMPLE_RATE = 1; -export const DEFAULT_MAX_VALUE_LENGTH = 250; -export const DEFAULT_NORMALIZE_DEPTH = 3; -export const DEFAULT_NORMALIZE_MAX_BREADTH = 1000; -export const DEFAULT_SHUTDOWN_TIMEOUT = 2000; - -export const defaultCoreOptions = { - maxBreadcrumbs: DEFAULT_MAX_BREADCRUMBS, - sampleRate: DEFAULT_SAMPLE_RATE, - maxValueLength: DEFAULT_MAX_VALUE_LENGTH, - normalizeDepth: DEFAULT_NORMALIZE_DEPTH, - normalizeMaxBreadth: DEFAULT_NORMALIZE_MAX_BREADTH, - shutdownTimeout: DEFAULT_SHUTDOWN_TIMEOUT, -}; diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts index baa7b9ff506e..0121a0af7898 100644 --- a/packages/node/src/sdk.ts +++ b/packages/node/src/sdk.ts @@ -1,4 +1,4 @@ -import { defaultCoreOptions, getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core'; +import { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core'; import { getIntegrationsToSetup } from '@sentry/core/build/types/integration'; import { getMainCarrier, setHubOnCarrier } from '@sentry/hub'; import { SessionStatus } from '@sentry/types'; @@ -137,7 +137,6 @@ export function init(options: NodeOptions = {}): void { // TODO(v7): Refactor this to reduce the logic above const clientOptions: NodeClientOptions = { ...options, - ...defaultCoreOptions, stackParser: stackParserFromOptions(options), integrations: getIntegrationsToSetup(options), transport, diff --git a/packages/types/src/options.ts b/packages/types/src/options.ts index 2fd9315d42eb..a7fe75366b21 100644 --- a/packages/types/src/options.ts +++ b/packages/types/src/options.ts @@ -94,13 +94,13 @@ export interface ClientOptions { * The maximum number of breadcrumbs sent with events. Defaults to 100. * Values over 100 will be ignored and 100 used instead. */ - maxBreadcrumbs: number; + maxBreadcrumbs?: number; /** A global sample rate to apply to all events (0 - 1). */ - sampleRate: number; + sampleRate?: number; /** Maximum number of chars a single value can have before it will be truncated. */ - maxValueLength: number; + maxValueLength?: number; /** * Maximum number of levels that normalization algorithm will traverse in objects and arrays. @@ -111,7 +111,7 @@ export interface ClientOptions { * - `extra` * Defaults to `3`. Set to `0` to disable. */ - normalizeDepth: number; + normalizeDepth?: number; /** * Maximum number of properties or elements that the normalization algorithm will output in any single array or object included in the normalized event. @@ -122,7 +122,7 @@ export interface ClientOptions { * - `extra` * Defaults to `1000` */ - normalizeMaxBreadth: number; + normalizeMaxBreadth?: number; /** * Controls how many milliseconds to wait before shutting down. The default is @@ -131,7 +131,7 @@ export interface ClientOptions { * high can cause the application to block for users with network connectivity * problems. */ - shutdownTimeout: number; + shutdownTimeout?: number; /** * A pattern for error messages which should not be sent to Sentry. From 69d7f6aa73a79ef70d4e56067d98afc51df73fb5 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 18 Apr 2022 10:01:58 -0400 Subject: [PATCH 14/33] add comments --- packages/browser/src/client.ts | 6 +++++- packages/node/src/client.ts | 2 +- packages/node/src/types.ts | 6 +++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/browser/src/client.ts b/packages/browser/src/client.ts index c80f6a5980c8..a889d7f69d06 100644 --- a/packages/browser/src/client.ts +++ b/packages/browser/src/client.ts @@ -23,10 +23,14 @@ export interface BaseBrowserOptions { denyUrls?: Array; } +/** + * Configuration options for the Sentry Browser SDK. + * @see @sentry/types Options for more information. + */ export interface BrowserOptions extends Options, BaseBrowserOptions {} /** - * Configuration options for the Sentry Browser SDK. + * Configuration options for the Sentry Browser SDK Client class * @see BrowserClient for more information. */ export interface BrowserClientOptions extends ClientOptions, BaseBrowserOptions {} diff --git a/packages/node/src/client.ts b/packages/node/src/client.ts index 9de06fe4f07d..7864fd1b7ccc 100644 --- a/packages/node/src/client.ts +++ b/packages/node/src/client.ts @@ -10,7 +10,7 @@ import { NodeClientOptions } from './types'; /** * The Sentry Node SDK Client. * - * @see NodeOptions for documentation on configuration options. + * @see NodeClientOptions for documentation on configuration options. * @see SentryClient for usage documentation. */ export class NodeClient extends BaseClient { diff --git a/packages/node/src/types.ts b/packages/node/src/types.ts index 66860f02f0ca..a2311a4698f9 100644 --- a/packages/node/src/types.ts +++ b/packages/node/src/types.ts @@ -17,10 +17,14 @@ export interface BaseNodeOptions { onFatalError?(error: Error): void; } +/** + * Configuration options for the Sentry Node SDK + * @see @sentry/types Options for more information. + */ export interface NodeOptions extends Options, BaseNodeOptions {} /** - * Configuration options for the Sentry Node SDK. + * Configuration options for the Sentry Node SDK Client class * @see NodeClient for more information. */ export interface NodeClientOptions extends ClientOptions, BaseNodeOptions {} From f3bce9ee59c5655903e832570dfdc0b442f7e65d Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 18 Apr 2022 11:25:44 -0400 Subject: [PATCH 15/33] cast option types --- packages/tracing/src/hubextensions.ts | 12 ++++++------ packages/tracing/src/utils.ts | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/tracing/src/hubextensions.ts b/packages/tracing/src/hubextensions.ts index bd38b270cc22..a3459d743c7c 100644 --- a/packages/tracing/src/hubextensions.ts +++ b/packages/tracing/src/hubextensions.ts @@ -1,9 +1,9 @@ import { getMainCarrier, Hub } from '@sentry/hub'; import { + ClientOptions, CustomSamplingContext, Integration, IntegrationClass, - Options, SamplingContext, TransactionContext, } from '@sentry/types'; @@ -41,7 +41,7 @@ function traceHeaders(this: Hub): { [key: string]: string } { * * @returns The given transaction with its `sampled` value set */ -function sample(transaction: T, options: Options, samplingContext: SamplingContext): T { +function sample(transaction: T, options: ClientOptions, samplingContext: SamplingContext): T { // nothing to do if tracing is not enabled if (!hasTracingEnabled(options)) { transaction.sampled = false; @@ -171,10 +171,10 @@ function _startTransaction( customSamplingContext?: CustomSamplingContext, ): Transaction { const client = this.getClient(); - const options = (client && client.getOptions()) || {}; + const options: Partial = (client && client.getOptions()) || {}; let transaction = new Transaction(transactionContext, this); - transaction = sample(transaction, options, { + transaction = sample(transaction, options as ClientOptions, { parentSampled: transactionContext.parentSampled, transactionContext, ...customSamplingContext, @@ -196,10 +196,10 @@ export function startIdleTransaction( customSamplingContext?: CustomSamplingContext, ): IdleTransaction { const client = hub.getClient(); - const options = (client && client.getOptions()) || {}; + const options: Partial = (client && client.getOptions()) || {}; let transaction = new IdleTransaction(transactionContext, hub, idleTimeout, onScope); - transaction = sample(transaction, options, { + transaction = sample(transaction, options as ClientOptions, { parentSampled: transactionContext.parentSampled, transactionContext, ...customSamplingContext, diff --git a/packages/tracing/src/utils.ts b/packages/tracing/src/utils.ts index 63598c00ac58..b6f6f2434e10 100644 --- a/packages/tracing/src/utils.ts +++ b/packages/tracing/src/utils.ts @@ -1,5 +1,5 @@ import { getCurrentHub, Hub } from '@sentry/hub'; -import { Options, Transaction } from '@sentry/types'; +import { ClientOptions, Transaction } from '@sentry/types'; /** * The `extractTraceparentData` function and `TRACEPARENT_REGEXP` constant used @@ -20,7 +20,7 @@ export { TRACEPARENT_REGEXP, extractTraceparentData } from '@sentry/utils'; * * Tracing is enabled when at least one of `tracesSampleRate` and `tracesSampler` is defined in the SDK config. */ -export function hasTracingEnabled(maybeOptions?: Options | undefined): boolean { +export function hasTracingEnabled(maybeOptions?: ClientOptions | undefined): boolean { const client = getCurrentHub().getClient(); const options = maybeOptions || (client && client.getOptions()); return !!options && ('tracesSampleRate' in options || 'tracesSampler' in options); From 4e9fb6b7a637267bc73ff8a270761337745a1e86 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 18 Apr 2022 13:25:08 -0400 Subject: [PATCH 16/33] explicit types --- packages/tracing/src/hubextensions.ts | 11 ++++++++--- packages/tracing/src/utils.ts | 6 ++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/tracing/src/hubextensions.ts b/packages/tracing/src/hubextensions.ts index a3459d743c7c..80bd7a5783c8 100644 --- a/packages/tracing/src/hubextensions.ts +++ b/packages/tracing/src/hubextensions.ts @@ -4,6 +4,7 @@ import { CustomSamplingContext, Integration, IntegrationClass, + Options, SamplingContext, TransactionContext, } from '@sentry/types'; @@ -41,7 +42,11 @@ function traceHeaders(this: Hub): { [key: string]: string } { * * @returns The given transaction with its `sampled` value set */ -function sample(transaction: T, options: ClientOptions, samplingContext: SamplingContext): T { +function sample( + transaction: T, + options: Pick, + samplingContext: SamplingContext, +): T { // nothing to do if tracing is not enabled if (!hasTracingEnabled(options)) { transaction.sampled = false; @@ -174,7 +179,7 @@ function _startTransaction( const options: Partial = (client && client.getOptions()) || {}; let transaction = new Transaction(transactionContext, this); - transaction = sample(transaction, options as ClientOptions, { + transaction = sample(transaction, options, { parentSampled: transactionContext.parentSampled, transactionContext, ...customSamplingContext, @@ -199,7 +204,7 @@ export function startIdleTransaction( const options: Partial = (client && client.getOptions()) || {}; let transaction = new IdleTransaction(transactionContext, hub, idleTimeout, onScope); - transaction = sample(transaction, options as ClientOptions, { + transaction = sample(transaction, options, { parentSampled: transactionContext.parentSampled, transactionContext, ...customSamplingContext, diff --git a/packages/tracing/src/utils.ts b/packages/tracing/src/utils.ts index b6f6f2434e10..9d999df486fb 100644 --- a/packages/tracing/src/utils.ts +++ b/packages/tracing/src/utils.ts @@ -1,5 +1,5 @@ import { getCurrentHub, Hub } from '@sentry/hub'; -import { ClientOptions, Transaction } from '@sentry/types'; +import { Options, Transaction } from '@sentry/types'; /** * The `extractTraceparentData` function and `TRACEPARENT_REGEXP` constant used @@ -20,7 +20,9 @@ export { TRACEPARENT_REGEXP, extractTraceparentData } from '@sentry/utils'; * * Tracing is enabled when at least one of `tracesSampleRate` and `tracesSampler` is defined in the SDK config. */ -export function hasTracingEnabled(maybeOptions?: ClientOptions | undefined): boolean { +export function hasTracingEnabled( + maybeOptions?: Pick | undefined, +): boolean { const client = getCurrentHub().getClient(); const options = maybeOptions || (client && client.getOptions()); return !!options && ('tracesSampleRate' in options || 'tracesSampler' in options); From 77b4a2161ddf423486dbf968c6b3cf5c061ceb1e Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 18 Apr 2022 13:45:00 -0400 Subject: [PATCH 17/33] fix import --- packages/browser/src/sdk.ts | 3 +-- packages/core/src/index.ts | 1 + packages/node/src/sdk.ts | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/browser/src/sdk.ts b/packages/browser/src/sdk.ts index 209ec27d55ef..eeaae289989b 100644 --- a/packages/browser/src/sdk.ts +++ b/packages/browser/src/sdk.ts @@ -1,5 +1,4 @@ -import { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core'; -import { getIntegrationsToSetup } from '@sentry/core/build/types/integration'; +import { getCurrentHub, getIntegrationsToSetup, initAndBind, Integrations as CoreIntegrations } from '@sentry/core'; import { Hub } from '@sentry/types'; import { addInstrumentationHandler, diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index ccf2aa519775..da68917c936e 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -37,6 +37,7 @@ export { initAndBind } from './sdk'; export { NoopTransport } from './transports/noop'; export { createTransport } from './transports/base'; export { SDK_VERSION } from './version'; +export { getIntegrationsToSetup } from './integration'; import * as Integrations from './integrations'; diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts index 0121a0af7898..54cbedbe0a3d 100644 --- a/packages/node/src/sdk.ts +++ b/packages/node/src/sdk.ts @@ -1,5 +1,4 @@ -import { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core'; -import { getIntegrationsToSetup } from '@sentry/core/build/types/integration'; +import { getCurrentHub, getIntegrationsToSetup, initAndBind, Integrations as CoreIntegrations } from '@sentry/core'; import { getMainCarrier, setHubOnCarrier } from '@sentry/hub'; import { SessionStatus } from '@sentry/types'; import { getGlobalObject, logger, stackParserFromOptions } from '@sentry/utils'; From bd62e2685d6bd78833ccbc176a6ef6f05553d61f Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 18 Apr 2022 22:04:30 -0400 Subject: [PATCH 18/33] fix tests --- packages/core/test/lib/base.test.ts | 183 +++++++++++++--------------- packages/core/test/mocks/client.ts | 4 +- packages/types/src/options.ts | 2 +- 3 files changed, 87 insertions(+), 102 deletions(-) diff --git a/packages/core/test/lib/base.test.ts b/packages/core/test/lib/base.test.ts index 1bd2750e5378..ab7ed325fe26 100644 --- a/packages/core/test/lib/base.test.ts +++ b/packages/core/test/lib/base.test.ts @@ -4,7 +4,7 @@ import { dsnToString, logger, SentryError, SyncPromise } from '@sentry/utils'; import * as integrationModule from '../../src/integration'; import { NoopTransport } from '../../src/transports/noop'; -import { setupTestTransport, TestClient } from '../mocks/client'; +import { setupTestTransport, TestClient, TestOptions } from '../mocks/client'; import { TestIntegration } from '../mocks/integration'; import { FakeTransport } from '../mocks/transport'; @@ -53,6 +53,15 @@ jest.mock('@sentry/utils', () => { }; }); +function getDefaultTestOptions(options: Partial = {}): TestOptions { + return { + integrations: [], + transport: new NoopTransport(), + stackParser: () => [], + ...options, + }; +} + describe('BaseClient', () => { beforeEach(() => { TestClient.sendEventCalled = undefined; @@ -67,7 +76,7 @@ describe('BaseClient', () => { test('returns the Dsn', () => { expect.assertions(1); - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); expect(dsnToString(client.getDsn()!)).toBe(PUBLIC_DSN); }); @@ -75,7 +84,7 @@ describe('BaseClient', () => { test('allows missing Dsn', () => { expect.assertions(1); - const options = {}; + const options = getDefaultTestOptions(); const client = new TestClient(options, setupTestTransport(options).transport); expect(client.getDsn()).toBeUndefined(); @@ -84,7 +93,7 @@ describe('BaseClient', () => { test('throws with invalid Dsn', () => { expect.assertions(1); - const options = { dsn: 'abc' }; + const options = getDefaultTestOptions({ dsn: 'abc' }); expect(() => new TestClient(options, setupTestTransport(options).transport)).toThrow(SentryError); }); }); @@ -93,7 +102,7 @@ describe('BaseClient', () => { test('returns the options', () => { expect.assertions(1); - const options = { dsn: PUBLIC_DSN, test: true }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, test: true }); const client = new TestClient(options, setupTestTransport(options).transport); expect(client.getOptions()).toEqual(options); @@ -104,7 +113,7 @@ describe('BaseClient', () => { test('returns the transport from client', () => { expect.assertions(2); - const options = { dsn: PUBLIC_DSN, transport: FakeTransport }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, transport: FakeTransport }); const client = new TestClient(options, new FakeTransport()); expect(client.getTransport()).toBeInstanceOf(FakeTransport); @@ -114,7 +123,7 @@ describe('BaseClient', () => { test('retruns NoopTransport when no transport is passed', () => { expect.assertions(2); - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); expect(client.getTransport()).toBeInstanceOf(NoopTransport); @@ -126,7 +135,7 @@ describe('BaseClient', () => { test('adds a breadcrumb', () => { expect.assertions(1); - const options = {}; + const options = getDefaultTestOptions({}); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -140,7 +149,7 @@ describe('BaseClient', () => { test('adds a timestamp to new breadcrumbs', () => { expect.assertions(1); - const options = {}; + const options = getDefaultTestOptions({}); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -154,7 +163,7 @@ describe('BaseClient', () => { test('discards breadcrumbs beyond maxBreadcrumbs', () => { expect.assertions(2); - const options = { maxBreadcrumbs: 1 }; + const options = getDefaultTestOptions({ maxBreadcrumbs: 1 }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -169,7 +178,7 @@ describe('BaseClient', () => { test('allows concurrent updates', () => { expect.assertions(1); - const options = {}; + const options = getDefaultTestOptions({}); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -184,7 +193,7 @@ describe('BaseClient', () => { expect.assertions(1); const beforeBreadcrumb = jest.fn(breadcrumb => breadcrumb); - const options = { beforeBreadcrumb }; + const options = getDefaultTestOptions({ beforeBreadcrumb }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -198,7 +207,7 @@ describe('BaseClient', () => { expect.assertions(1); const beforeBreadcrumb = jest.fn(() => ({ message: 'changed' })); - const options = { beforeBreadcrumb }; + const options = getDefaultTestOptions({ beforeBreadcrumb }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -212,7 +221,7 @@ describe('BaseClient', () => { expect.assertions(1); const beforeBreadcrumb = jest.fn(() => null); - const options = { beforeBreadcrumb }; + const options = getDefaultTestOptions({ beforeBreadcrumb }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -226,7 +235,7 @@ describe('BaseClient', () => { expect.assertions(2); const beforeBreadcrumb = jest.fn((breadcrumb, hint) => ({ ...breadcrumb, data: hint.data })); - const options = { beforeBreadcrumb }; + const options = getDefaultTestOptions({ beforeBreadcrumb }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -240,7 +249,7 @@ describe('BaseClient', () => { describe('captureException', () => { test('captures and sends exceptions', () => { - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureException(new Error('test exception')); @@ -263,7 +272,7 @@ describe('BaseClient', () => { }); test('allows for providing explicit scope', () => { - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); scope.setExtra('foo', 'wat'); @@ -291,7 +300,7 @@ describe('BaseClient', () => { }); test('allows for clearing data from existing scope if explicit one does so in a callback function', () => { - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); scope.setExtra('foo', 'wat'); @@ -326,7 +335,7 @@ describe('BaseClient', () => { // already-seen check to work . Any primitive which is passed without being wrapped will be captured each time it // is encountered, so this test doesn't apply. ])("doesn't capture the same exception twice - %s", (_name: string, thrown: any) => { - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); expect(thrown.__sentry_captured__).toBeUndefined(); @@ -345,7 +354,7 @@ describe('BaseClient', () => { describe('captureMessage', () => { test('captures and sends messages', () => { - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureMessage('test message'); @@ -362,7 +371,7 @@ describe('BaseClient', () => { }); test('should call eventFromException if input to captureMessage is not a primitive', () => { - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const spy = jest.spyOn(TestClient.instance!, 'eventFromException'); @@ -381,7 +390,7 @@ describe('BaseClient', () => { }); test('allows for providing explicit scope', () => { - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); scope.setExtra('foo', 'wat'); @@ -415,7 +424,7 @@ describe('BaseClient', () => { test('skips when disabled', () => { expect.assertions(1); - const options = { enabled: false, dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ enabled: false, dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -427,7 +436,7 @@ describe('BaseClient', () => { test('skips without a Dsn', () => { expect.assertions(1); - const options = {}; + const options = getDefaultTestOptions({}); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -445,7 +454,7 @@ describe('BaseClient', () => { // already-seen check to work . Any primitive which is passed without being wrapped will be captured each time it // is encountered, so this test doesn't apply. ])("doesn't capture an event wrapping the same exception twice - %s", (_name: string, thrown: any) => { - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); // Note: this is the same test as in `describe(captureException)`, except with the exception already wrapped in a // hint and accompanying an event. Duplicated here because some methods skip `captureException` and go straight to // `captureEvent`. @@ -469,7 +478,7 @@ describe('BaseClient', () => { test('sends an event', () => { expect.assertions(2); - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -489,7 +498,7 @@ describe('BaseClient', () => { test('does not overwrite existing timestamp', () => { expect.assertions(2); - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -509,7 +518,7 @@ describe('BaseClient', () => { test('adds event_id from hint if available', () => { expect.assertions(1); - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -528,9 +537,7 @@ describe('BaseClient', () => { test('sets default environment to `production` if none provided', () => { expect.assertions(1); - const options = { - dsn: PUBLIC_DSN, - }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -549,10 +556,7 @@ describe('BaseClient', () => { test('adds the configured environment', () => { expect.assertions(1); - const options = { - dsn: PUBLIC_DSN, - environment: 'env', - }; + const options = getDefaultTestOptions({ environment: 'env', dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -571,10 +575,7 @@ describe('BaseClient', () => { test('allows for environment to be explicitly set to falsy value', () => { expect.assertions(1); - const options = { - dsn: PUBLIC_DSN, - environment: undefined, - }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, environment: undefined }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -593,10 +594,7 @@ describe('BaseClient', () => { test('adds the configured release', () => { expect.assertions(1); - const options = { - dsn: PUBLIC_DSN, - release: 'v1.0.0', - }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, release: 'v1.0.0' }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -616,7 +614,7 @@ describe('BaseClient', () => { test('adds breadcrumbs', () => { expect.assertions(4); - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); scope.addBreadcrumb({ message: 'breadcrumb' }, 100); @@ -632,7 +630,7 @@ describe('BaseClient', () => { test('limits previously saved breadcrumbs', () => { expect.assertions(2); - const options = { dsn: PUBLIC_DSN, maxBreadcrumbs: 1 }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, maxBreadcrumbs: 1 }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -648,7 +646,7 @@ describe('BaseClient', () => { test('adds context data', () => { expect.assertions(1); - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); scope.setExtra('b', 'b'); @@ -673,7 +671,7 @@ describe('BaseClient', () => { test('adds fingerprint', () => { expect.assertions(1); - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); scope.setFingerprint(['abcd']); @@ -692,7 +690,7 @@ describe('BaseClient', () => { }); test('adds installed integrations to sdk info', () => { - const options = { dsn: PUBLIC_DSN, integrations: [new TestIntegration()] }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, integrations: [new TestIntegration()] }); const client = new TestClient(options, setupTestTransport(options).transport); client.setupIntegrations(); @@ -706,7 +704,7 @@ describe('BaseClient', () => { test('normalizes event with default depth of 3', () => { expect.assertions(1); - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const fourLevelsObject = { a: { @@ -758,10 +756,7 @@ describe('BaseClient', () => { test('normalization respects `normalizeDepth` option', () => { expect.assertions(1); - const options = { - dsn: PUBLIC_DSN, - normalizeDepth: 2, - }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, normalizeDepth: 2 }); const client = new TestClient(options, setupTestTransport(options).transport); const fourLevelsObject = { a: { @@ -810,10 +805,7 @@ describe('BaseClient', () => { test('skips normalization when `normalizeDepth: 0`', () => { expect.assertions(1); - const options = { - dsn: PUBLIC_DSN, - normalizeDepth: 0, - }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, normalizeDepth: 0 }); const client = new TestClient(options, setupTestTransport(options).transport); const fourLevelsObject = { a: { @@ -867,7 +859,7 @@ describe('BaseClient', () => { test('normalization applies to Transaction and Span consistently', () => { expect.assertions(1); - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const transaction: Event = { contexts: { @@ -942,7 +934,7 @@ describe('BaseClient', () => { expect.assertions(1); const beforeSend = jest.fn(event => event); - const options = { dsn: PUBLIC_DSN, beforeSend }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureEvent({ message: 'hello' }); @@ -954,7 +946,7 @@ describe('BaseClient', () => { expect.assertions(1); const beforeSend = jest.fn(() => ({ message: 'changed1' })); - const options = { dsn: PUBLIC_DSN, beforeSend }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureEvent({ message: 'hello' }); @@ -966,7 +958,8 @@ describe('BaseClient', () => { expect.assertions(3); const beforeSend = jest.fn(() => null); - const client = new TestClient({ dsn: PUBLIC_DSN, beforeSend }, setupTestTransport({ dsn: PUBLIC_DSN }).transport); + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); + const client = new TestClient(options, setupTestTransport(options).transport); const captureExceptionSpy = jest.spyOn(client, 'captureException'); const loggerErrorSpy = jest.spyOn(logger, 'error'); @@ -983,9 +976,9 @@ describe('BaseClient', () => { for (const val of invalidValues) { const beforeSend = jest.fn(() => val); - const options = { dsn: PUBLIC_DSN, beforeSend }; // @ts-ignore we need to test regular-js behavior - const client = new TestClient(options, setupTestTransport({ dsn: PUBLIC_DSN }).transport); + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); + const client = new TestClient(options, setupTestTransport(options).transport); const loggerErrorSpy = jest.spyOn(logger, 'error'); client.captureEvent({ message: 'hello' }); @@ -1009,7 +1002,7 @@ describe('BaseClient', () => { }, 1); }), ); - const options = { dsn: PUBLIC_DSN, beforeSend }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureEvent({ message: 'hello' }); @@ -1038,7 +1031,7 @@ describe('BaseClient', () => { }, 1); }), ); - const options = { dsn: PUBLIC_DSN, beforeSend }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureEvent({ message: 'hello' }); @@ -1067,7 +1060,7 @@ describe('BaseClient', () => { }); }), ); - const options = { dsn: PUBLIC_DSN, beforeSend }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureEvent({ message: 'hello' }); @@ -1080,7 +1073,7 @@ describe('BaseClient', () => { expect.assertions(2); const beforeSend = jest.fn((event, hint) => ({ ...event, data: hint.data })); - const options = { dsn: PUBLIC_DSN, beforeSend }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureEvent({ message: 'hello' }, { data: 'someRandomThing' }); @@ -1093,13 +1086,13 @@ describe('BaseClient', () => { expect.assertions(1); const client = new TestClient( - { + getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend() { return null; }, - }, - setupTestTransport({ dsn: PUBLIC_DSN }).transport, + }), + setupTestTransport(getDefaultTestOptions({ dsn: PUBLIC_DSN })).transport, ); const recordLostEventSpy = jest.fn(); jest.spyOn(client, 'getTransport').mockImplementationOnce( @@ -1117,7 +1110,10 @@ describe('BaseClient', () => { test('eventProcessor can drop the even when it returns null', () => { expect.assertions(3); - const client = new TestClient({ dsn: PUBLIC_DSN }, setupTestTransport({ dsn: PUBLIC_DSN }).transport); + const client = new TestClient( + getDefaultTestOptions({ dsn: PUBLIC_DSN }), + setupTestTransport(getDefaultTestOptions({ dsn: PUBLIC_DSN })).transport, + ); const captureExceptionSpy = jest.spyOn(client, 'captureException'); const loggerErrorSpy = jest.spyOn(logger, 'error'); const scope = new Scope(); @@ -1133,7 +1129,7 @@ describe('BaseClient', () => { test('eventProcessor records dropped events', () => { expect.assertions(1); - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const recordLostEventSpy = jest.fn(); @@ -1155,7 +1151,7 @@ describe('BaseClient', () => { test('eventProcessor sends an event and logs when it crashes', () => { expect.assertions(3); - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const captureExceptionSpy = jest.spyOn(client, 'captureException'); const loggerErrorSpy = jest.spyOn(logger, 'error'); @@ -1184,10 +1180,7 @@ describe('BaseClient', () => { test('records events dropped due to sampleRate', () => { expect.assertions(1); - const options = { - dsn: PUBLIC_DSN, - sampleRate: 0, - }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, sampleRate: 0 }); const client = new TestClient(options, setupTestTransport(options).transport); const recordLostEventSpy = jest.fn(); @@ -1211,10 +1204,7 @@ describe('BaseClient', () => { test('setup each one of them on setupIntegration call', () => { expect.assertions(2); - const options = { - dsn: PUBLIC_DSN, - integrations: [new TestIntegration()], - }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, integrations: [new TestIntegration()] }); const client = new TestClient(options, setupTestTransport(options).transport); client.setupIntegrations(); @@ -1225,9 +1215,7 @@ describe('BaseClient', () => { test('skips installation if DSN is not provided', () => { expect.assertions(2); - const options = { - integrations: [new TestIntegration()], - }; + const options = getDefaultTestOptions({ integrations: [new TestIntegration()] }); const client = new TestClient(options, setupTestTransport(options).transport); client.setupIntegrations(); @@ -1238,11 +1226,11 @@ describe('BaseClient', () => { test('skips installation if enabled is set to false', () => { expect.assertions(2); - const options = { + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, enabled: false, integrations: [new TestIntegration()], - }; + }); const client = new TestClient(options, setupTestTransport(options).transport); client.setupIntegrations(); @@ -1253,10 +1241,7 @@ describe('BaseClient', () => { test('skips installation if integrations are already installed', () => { expect.assertions(4); - const options = { - dsn: PUBLIC_DSN, - integrations: [new TestIntegration()], - }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, integrations: [new TestIntegration()] }); const client = new TestClient(options, setupTestTransport(options).transport); // note: not the `Client` method `setupIntegrations`, but the free-standing function which that method calls const setupIntegrationsHelper = jest.spyOn(integrationModule, 'setupIntegrations'); @@ -1281,11 +1266,11 @@ describe('BaseClient', () => { expect.assertions(5); const client = new TestClient( - { + getDefaultTestOptions({ dsn: PUBLIC_DSN, enableSend: true, transport: FakeTransport, - }, + }), new FakeTransport(), ); @@ -1310,11 +1295,11 @@ describe('BaseClient', () => { expect.assertions(5); const client = new TestClient( - { + getDefaultTestOptions({ dsn: PUBLIC_DSN, enableSend: true, transport: FakeTransport, - }, + }), new FakeTransport(), ); @@ -1349,11 +1334,11 @@ describe('BaseClient', () => { expect.assertions(2); const client = new TestClient( - { + getDefaultTestOptions({ dsn: PUBLIC_DSN, enableSend: true, transport: FakeTransport, - }, + }), new FakeTransport(), ); @@ -1373,7 +1358,7 @@ describe('BaseClient', () => { jest.useRealTimers(); expect.assertions(3); - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); return Promise.all([ @@ -1394,7 +1379,7 @@ describe('BaseClient', () => { test('sends sessions to the client', () => { expect.assertions(1); - const options = { dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const session = new Session({ release: 'test' }); @@ -1406,7 +1391,7 @@ describe('BaseClient', () => { test('skips when disabled', () => { expect.assertions(1); - const options = { enabled: false, dsn: PUBLIC_DSN }; + const options = getDefaultTestOptions({ enabled: false, dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const session = new Session({ release: 'test' }); diff --git a/packages/core/test/mocks/client.ts b/packages/core/test/mocks/client.ts index 707513ff91b1..715520ce11dc 100644 --- a/packages/core/test/mocks/client.ts +++ b/packages/core/test/mocks/client.ts @@ -1,12 +1,12 @@ import { Session } from '@sentry/hub'; -import { Event, Integration, Options, Severity, SeverityLevel, Transport } from '@sentry/types'; +import { Event, Integration, Severity, SeverityLevel, Transport, ClientOptions } from '@sentry/types'; import { resolvedSyncPromise } from '@sentry/utils'; import { BaseClient } from '../../src/baseclient'; import { initAndBind } from '../../src/sdk'; import { NewTransport } from '../../src/transports/base'; import { NoopTransport } from '../../src/transports/noop'; -export interface TestOptions extends Options { +export interface TestOptions extends ClientOptions { test?: boolean; mockInstallFailure?: boolean; enableSend?: boolean; diff --git a/packages/types/src/options.ts b/packages/types/src/options.ts index a7fe75366b21..8bd273752700 100644 --- a/packages/types/src/options.ts +++ b/packages/types/src/options.ts @@ -61,7 +61,7 @@ export interface ClientOptions { /** * Transport object that should be used to send events to Sentry */ - transport: Transport; + transport: TransportClass; /** * A stack parser implementation From e26e61542b42a19ac48899112f242e398af1bc74 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 18 Apr 2022 22:07:38 -0400 Subject: [PATCH 19/33] fix transport types --- packages/browser/src/sdk.ts | 5 ++++- packages/core/test/lib/base.test.ts | 2 +- packages/node/src/sdk.ts | 7 ++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/browser/src/sdk.ts b/packages/browser/src/sdk.ts index eeaae289989b..05d9d9c34462 100644 --- a/packages/browser/src/sdk.ts +++ b/packages/browser/src/sdk.ts @@ -6,6 +6,7 @@ import { logger, resolvedSyncPromise, stackParserFromOptions, + supportsFetch, } from '@sentry/utils'; import { BrowserClient, BrowserClientOptions, BrowserOptions } from './client'; @@ -13,6 +14,7 @@ import { IS_DEBUG_BUILD } from './flags'; import { ReportDialogOptions, wrap as internalWrap } from './helpers'; import { Breadcrumbs, Dedupe, GlobalHandlers, LinkedErrors, TryCatch, UserAgent } from './integrations'; import { defaultStackParsers } from './stack-parsers'; +import { FetchTransport, XHRTransport } from './transports'; import { setupBrowserTransport } from './transports/setup'; export const defaultIntegrations = [ @@ -109,7 +111,8 @@ export function init(options: BrowserOptions = {}): void { ...options, stackParser: stackParserFromOptions(options), integrations: getIntegrationsToSetup(options), - transport, + // TODO(v7): get rid of transport being passed down below + transport: options.transport || (supportsFetch() ? FetchTransport : XHRTransport), }; initAndBind(BrowserClient, clientOptions, transport, newTransport); diff --git a/packages/core/test/lib/base.test.ts b/packages/core/test/lib/base.test.ts index ab7ed325fe26..f194e3295398 100644 --- a/packages/core/test/lib/base.test.ts +++ b/packages/core/test/lib/base.test.ts @@ -56,7 +56,7 @@ jest.mock('@sentry/utils', () => { function getDefaultTestOptions(options: Partial = {}): TestOptions { return { integrations: [], - transport: new NoopTransport(), + transport: NoopTransport, stackParser: () => [], ...options, }; diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts index 54cbedbe0a3d..fa4b22a12066 100644 --- a/packages/node/src/sdk.ts +++ b/packages/node/src/sdk.ts @@ -8,7 +8,7 @@ import { NodeClient } from './client'; import { IS_DEBUG_BUILD } from './flags'; import { Console, ContextLines, Http, LinkedErrors, OnUncaughtException, OnUnhandledRejection } from './integrations'; import { nodeStackParser } from './stack-parser'; -import { setupNodeTransport } from './transports'; +import { HTTPSTransport, HTTPTransport, setupNodeTransport } from './transports'; import { NodeClientOptions, NodeOptions } from './types'; export const defaultIntegrations = [ @@ -138,7 +138,8 @@ export function init(options: NodeOptions = {}): void { ...options, stackParser: stackParserFromOptions(options), integrations: getIntegrationsToSetup(options), - transport, + // TODO(v7): Fix me when we switch to new transports entirely. + transport: options.transport || (transport instanceof HTTPTransport ? HTTPTransport : HTTPSTransport), }; initAndBind(NodeClient, clientOptions, transport, newTransport); @@ -198,7 +199,7 @@ export function isAutoSessionTrackingEnabled(client?: NodeClient): boolean { if (client === undefined) { return false; } - const clientOptions: NodeClientOptions = client && client.getOptions(); + const clientOptions = client && client.getOptions(); if (clientOptions && clientOptions.autoSessionTracking !== undefined) { return clientOptions.autoSessionTracking; } From e3d1681dbc8c8beacbfaeb3070b066e26924b920 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 18 Apr 2022 22:47:44 -0400 Subject: [PATCH 20/33] yarn fix --- packages/core/test/mocks/client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/test/mocks/client.ts b/packages/core/test/mocks/client.ts index 715520ce11dc..8eca101ee32a 100644 --- a/packages/core/test/mocks/client.ts +++ b/packages/core/test/mocks/client.ts @@ -1,5 +1,5 @@ import { Session } from '@sentry/hub'; -import { Event, Integration, Severity, SeverityLevel, Transport, ClientOptions } from '@sentry/types'; +import { ClientOptions, Event, Integration, Severity, SeverityLevel, Transport } from '@sentry/types'; import { resolvedSyncPromise } from '@sentry/utils'; import { BaseClient } from '../../src/baseclient'; From 5bbcc5cbba5243984f344fbacc91fa8fd4ce3ebf Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 18 Apr 2022 23:07:12 -0400 Subject: [PATCH 21/33] round 1 of fixing tests --- .../unit/integrations/linkederrors.test.ts | 18 +++++-- .../test/unit/transports/setup.test.ts | 16 ++++-- packages/core/test/lib/base.test.ts | 11 +--- packages/core/test/lib/sdk.test.ts | 18 ++++--- packages/core/test/mocks/client.ts | 10 ++++ packages/node/test/client.test.ts | 37 +++++++++----- packages/node/test/index.test.ts | 50 +++++++++++-------- packages/node/test/integrations/http.test.ts | 18 +++++-- .../test/integrations/linkederrors.test.ts | 21 ++++++-- packages/node/test/transports/setup.test.ts | 12 ++++- packages/tracing/test/errors.test.ts | 3 +- 11 files changed, 146 insertions(+), 68 deletions(-) diff --git a/packages/browser/test/unit/integrations/linkederrors.test.ts b/packages/browser/test/unit/integrations/linkederrors.test.ts index 6ccd4b5975a3..393568164863 100644 --- a/packages/browser/test/unit/integrations/linkederrors.test.ts +++ b/packages/browser/test/unit/integrations/linkederrors.test.ts @@ -1,10 +1,20 @@ import { Event as SentryEvent, Exception, ExtendedError } from '@sentry/types'; import { createStackParser } from '@sentry/utils'; -import { BrowserClient } from '../../../src/client'; +import { BrowserClient, BrowserClientOptions } from '../../../src/client'; import * as LinkedErrorsModule from '../../../src/integrations/linkederrors'; import { defaultStackParsers } from '../../../src/stack-parsers'; import { setupBrowserTransport } from '../../../src/transports'; +import { NoopTransport } from '@sentry/core/src/transports/noop'; + +function getDefaultBrowserOptions(options: Partial = {}): BrowserClientOptions { + return { + integrations: [], + transport: NoopTransport, + stackParser: () => [], + ...options, + }; +} const parser = createStackParser(...defaultStackParsers); @@ -45,7 +55,7 @@ describe('LinkedErrors', () => { one.cause = two; const originalException = one; - const options = { stackParser: parser }; + const options = getDefaultBrowserOptions({ stackParser: parser }); const client = new BrowserClient(options, setupBrowserTransport(options).transport); return client.eventFromException(originalException).then(event => { const result = LinkedErrorsModule._handler(parser, 'cause', 5, event, { @@ -76,7 +86,7 @@ describe('LinkedErrors', () => { one.reason = two; const originalException = one; - const options = { stackParser: parser }; + const options = getDefaultBrowserOptions({ stackParser: parser }); const client = new BrowserClient(options, setupBrowserTransport(options).transport); return client.eventFromException(originalException).then(event => { const result = LinkedErrorsModule._handler(parser, 'reason', 5, event, { @@ -103,7 +113,7 @@ describe('LinkedErrors', () => { one.cause = two; two.cause = three; - const options = { stackParser: parser }; + const options = getDefaultBrowserOptions({ stackParser: parser }); const client = new BrowserClient(options, setupBrowserTransport(options).transport); const originalException = one; return client.eventFromException(originalException).then(event => { diff --git a/packages/browser/test/unit/transports/setup.test.ts b/packages/browser/test/unit/transports/setup.test.ts index 2683a0619aea..3f9497a97933 100644 --- a/packages/browser/test/unit/transports/setup.test.ts +++ b/packages/browser/test/unit/transports/setup.test.ts @@ -8,6 +8,16 @@ import { XHRTransport, } from '../../../src/transports'; import { SimpleTransport } from '../mocks/simpletransport'; +import { BrowserClientOptions } from '../../../src/client'; + +function getDefaultBrowserOptions(options: Partial = {}): BrowserClientOptions { + return { + integrations: [], + transport: NoopTransport, + stackParser: () => [], + ...options, + }; +} const DSN = 'https://username@domain/123'; @@ -64,7 +74,7 @@ describe('setupBrowserTransport', () => { }); it('returns the instantiated transport passed via the options', () => { - const options = { dsn: DSN, transport: SimpleTransport }; + const options = getDefaultBrowserOptions({ dsn: DSN, transport: SimpleTransport }); const { transport, newTransport } = setupBrowserTransport(options); expect(transport).toBeDefined(); @@ -73,7 +83,7 @@ describe('setupBrowserTransport', () => { }); it('returns fetchTransports if fetch is supported', () => { - const options = { dsn: DSN }; + const options = getDefaultBrowserOptions({ dsn: DSN }); const { transport, newTransport } = setupBrowserTransport(options); expect(transport).toBeDefined(); @@ -86,7 +96,7 @@ describe('setupBrowserTransport', () => { it('returns xhrTransports if fetch is not supported', () => { fetchSupported = false; - const options = { dsn: DSN }; + const options = getDefaultBrowserOptions({ dsn: DSN }); const { transport, newTransport } = setupBrowserTransport(options); expect(transport).toBeDefined(); diff --git a/packages/core/test/lib/base.test.ts b/packages/core/test/lib/base.test.ts index f194e3295398..c795728364a4 100644 --- a/packages/core/test/lib/base.test.ts +++ b/packages/core/test/lib/base.test.ts @@ -4,7 +4,7 @@ import { dsnToString, logger, SentryError, SyncPromise } from '@sentry/utils'; import * as integrationModule from '../../src/integration'; import { NoopTransport } from '../../src/transports/noop'; -import { setupTestTransport, TestClient, TestOptions } from '../mocks/client'; +import { setupTestTransport, TestClient, getDefaultTestOptions } from '../mocks/client'; import { TestIntegration } from '../mocks/integration'; import { FakeTransport } from '../mocks/transport'; @@ -53,15 +53,6 @@ jest.mock('@sentry/utils', () => { }; }); -function getDefaultTestOptions(options: Partial = {}): TestOptions { - return { - integrations: [], - transport: NoopTransport, - stackParser: () => [], - ...options, - }; -} - describe('BaseClient', () => { beforeEach(() => { TestClient.sendEventCalled = undefined; diff --git a/packages/core/test/lib/sdk.test.ts b/packages/core/test/lib/sdk.test.ts index 578361a97511..8b59afdedee5 100644 --- a/packages/core/test/lib/sdk.test.ts +++ b/packages/core/test/lib/sdk.test.ts @@ -3,7 +3,7 @@ import { Client, Integration } from '@sentry/types'; import { installedIntegrations } from '../../src/integration'; import { initAndBind } from '../../src/sdk'; -import { setupTestTransport, TestClient, TestOptions } from '../mocks/client'; +import { setupTestTransport, TestClient, TestOptions, getDefaultTestOptions } from '../mocks/client'; // eslint-disable-next-line no-var declare var global: any; @@ -55,7 +55,7 @@ describe('SDK', () => { new MockIntegration('MockIntegration 1'), new MockIntegration('MockIntegration 2'), ]; - const options = { dsn: PUBLIC_DSN, defaultIntegrations: DEFAULT_INTEGRATIONS }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, defaultIntegrations: DEFAULT_INTEGRATIONS }); initAndBind(TestClient, options, setupTestTransport(options).transport); expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(1); expect((DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).mock.calls.length).toBe(1); @@ -66,7 +66,7 @@ describe('SDK', () => { new MockIntegration('MockIntegration 1'), new MockIntegration('MockIntegration 2'), ]; - const options: TestOptions = { dsn: PUBLIC_DSN, defaultIntegrations: false }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, defaultIntegrations: false }); initAndBind(TestClient, options, setupTestTransport(options).transport); expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(0); expect((DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).mock.calls.length).toBe(0); @@ -77,7 +77,7 @@ describe('SDK', () => { new MockIntegration('MockIntegration 1'), new MockIntegration('MockIntegration 2'), ]; - const options = { dsn: PUBLIC_DSN, integrations }; + const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, integrations }); initAndBind(TestClient, options, setupTestTransport(options).transport); expect((integrations[0].setupOnce as jest.Mock).mock.calls.length).toBe(1); expect((integrations[1].setupOnce as jest.Mock).mock.calls.length).toBe(1); @@ -92,7 +92,11 @@ describe('SDK', () => { new MockIntegration('MockIntegration 1'), new MockIntegration('MockIntegration 3'), ]; - const options = { dsn: PUBLIC_DSN, defaultIntegrations: DEFAULT_INTEGRATIONS, integrations }; + const options = getDefaultTestOptions({ + dsn: PUBLIC_DSN, + defaultIntegrations: DEFAULT_INTEGRATIONS, + integrations, + }); initAndBind(TestClient, options, setupTestTransport(options).transport); // 'MockIntegration 1' should be overridden by the one with the same name provided through options expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(0); @@ -107,11 +111,11 @@ describe('SDK', () => { new MockIntegration('MockIntegration 2'), ]; const newIntegration = new MockIntegration('MockIntegration 3'); - const options = { + const options = getDefaultTestOptions({ defaultIntegrations: DEFAULT_INTEGRATIONS, dsn: PUBLIC_DSN, integrations: (integrations: Integration[]) => integrations.slice(0, 1).concat(newIntegration), - }; + }); initAndBind(TestClient, options, setupTestTransport(options).transport); expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(1); expect((newIntegration.setupOnce as jest.Mock).mock.calls.length).toBe(1); diff --git a/packages/core/test/mocks/client.ts b/packages/core/test/mocks/client.ts index 8eca101ee32a..bb208c2ddbe8 100644 --- a/packages/core/test/mocks/client.ts +++ b/packages/core/test/mocks/client.ts @@ -6,6 +6,16 @@ import { BaseClient } from '../../src/baseclient'; import { initAndBind } from '../../src/sdk'; import { NewTransport } from '../../src/transports/base'; import { NoopTransport } from '../../src/transports/noop'; + +export function getDefaultTestOptions(options: Partial = {}): TestOptions { + return { + integrations: [], + transport: NoopTransport, + stackParser: () => [], + ...options, + }; +} + export interface TestOptions extends ClientOptions { test?: boolean; mockInstallFailure?: boolean; diff --git a/packages/node/test/client.test.ts b/packages/node/test/client.test.ts index 1cddd0e85e3f..c56a302a9a00 100644 --- a/packages/node/test/client.test.ts +++ b/packages/node/test/client.test.ts @@ -1,10 +1,21 @@ import { Scope, SessionFlusher } from '@sentry/hub'; +import { NoopTransport } from '@sentry/core'; import { NodeClient } from '../src'; import { setupNodeTransport } from '../src/transports'; +import { NodeClientOptions } from '../src/types'; const PUBLIC_DSN = 'https://username@domain/123'; +function getDefaultNodeClientOptions(options: Partial = {}): NodeClientOptions { + return { + integrations: [], + transport: NoopTransport, + stackParser: () => [], + ...options, + }; +} + describe('NodeClient', () => { let client: NodeClient; @@ -15,7 +26,7 @@ describe('NodeClient', () => { describe('captureException', () => { test('when autoSessionTracking is enabled, and requestHandler is not used -> requestStatus should not be set', () => { - const options = { dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.4' }; + const options = getDefaultNodeClientOptions({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.4' }); client = new NodeClient(options, setupNodeTransport(options).transport); const scope = new Scope(); scope.setRequestSession({ status: 'ok' }); @@ -26,7 +37,7 @@ describe('NodeClient', () => { expect(requestSession!.status).toEqual('ok'); }); test('when autoSessionTracking is disabled -> requestStatus should not be set', () => { - const options = { dsn: PUBLIC_DSN, autoSessionTracking: false, release: '1.4' }; + const options = getDefaultNodeClientOptions({ dsn: PUBLIC_DSN, autoSessionTracking: false, release: '1.4' }); client = new NodeClient(options, setupNodeTransport(options).transport); // It is required to initialise SessionFlusher to capture Session Aggregates (it is usually initialised // by the`requestHandler`) @@ -41,7 +52,7 @@ describe('NodeClient', () => { expect(requestSession!.status).toEqual('ok'); }); test('when autoSessionTracking is enabled + requestSession status is Crashed -> requestStatus should not be overridden', () => { - const options = { dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.4' }; + const options = getDefaultNodeClientOptions({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.4' }); client = new NodeClient(options, setupNodeTransport(options).transport); // It is required to initialise SessionFlusher to capture Session Aggregates (it is usually initialised // by the`requestHandler`) @@ -56,7 +67,7 @@ describe('NodeClient', () => { expect(requestSession!.status).toEqual('crashed'); }); test('when autoSessionTracking is enabled + error occurs within request bounds -> requestStatus should be set to Errored', () => { - const options = { dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.4' }; + const options = getDefaultNodeClientOptions({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.4' }); client = new NodeClient(options, setupNodeTransport(options).transport); // It is required to initialise SessionFlusher to capture Session Aggregates (it is usually initialised // by the`requestHandler`) @@ -71,7 +82,7 @@ describe('NodeClient', () => { expect(requestSession!.status).toEqual('errored'); }); test('when autoSessionTracking is enabled + error occurs outside of request bounds -> requestStatus should not be set to Errored', () => { - const options = { dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.4' }; + const options = getDefaultNodeClientOptions({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.4' }); client = new NodeClient(options, setupNodeTransport(options).transport); // It is required to initialise SessionFlusher to capture Session Aggregates (it is usually initialised // by the`requestHandler`) @@ -88,7 +99,7 @@ describe('NodeClient', () => { describe('captureEvent()', () => { test('If autoSessionTracking is disabled, requestSession status should not be set', () => { - const options = { dsn: PUBLIC_DSN, autoSessionTracking: false, release: '1.4' }; + const options = getDefaultNodeClientOptions({ dsn: PUBLIC_DSN, autoSessionTracking: false, release: '1.4' }); client = new NodeClient(options, setupNodeTransport(options).transport); // It is required to initialise SessionFlusher to capture Session Aggregates (it is usually initialised // by the`requestHandler`) @@ -107,7 +118,7 @@ describe('NodeClient', () => { }); test('When captureEvent is called with an exception, requestSession status should be set to Errored', () => { - const options = { dsn: PUBLIC_DSN, autoSessionTracking: true, release: '2.2' }; + const options = getDefaultNodeClientOptions({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '2.2' }); client = new NodeClient(options, setupNodeTransport(options).transport); // It is required to initialise SessionFlusher to capture Session Aggregates (it is usually initialised // by the`requestHandler`) @@ -123,7 +134,7 @@ describe('NodeClient', () => { }); test('When captureEvent is called without an exception, requestSession status should not be set to Errored', () => { - const options = { dsn: PUBLIC_DSN, autoSessionTracking: true, release: '2.2' }; + const options = getDefaultNodeClientOptions({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '2.2' }); client = new NodeClient(options, setupNodeTransport(options).transport); // It is required to initialise SessionFlusher to capture Session Aggregates (it is usually initialised // by the`requestHandler`) @@ -139,7 +150,7 @@ describe('NodeClient', () => { }); test('When captureEvent is called with an exception but outside of a request, then requestStatus should not be set', () => { - const options = { dsn: PUBLIC_DSN, autoSessionTracking: true, release: '2.2' }; + const options = getDefaultNodeClientOptions({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '2.2' }); client = new NodeClient(options, setupNodeTransport(options).transport); // It is required to initialise SessionFlusher to capture Session Aggregates (it is usually initialised // by the`requestHandler`) @@ -157,7 +168,7 @@ describe('NodeClient', () => { }); test('When captureEvent is called with a transaction, then requestSession status should not be set', () => { - const options = { dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.3' }; + const options = getDefaultNodeClientOptions({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.3' }); client = new NodeClient(options, setupNodeTransport(options).transport); // It is required to initialise SessionFlusher to capture Session Aggregates (it is usually initialised // by the`requestHandler`) @@ -172,7 +183,7 @@ describe('NodeClient', () => { }); test('When captureEvent is called with an exception but requestHandler is not used, then requestSession status should not be set', () => { - const options = { dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.3' }; + const options = getDefaultNodeClientOptions({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.3' }); client = new NodeClient(options, setupNodeTransport(options).transport); const scope = new Scope(); @@ -192,11 +203,11 @@ describe('NodeClient', () => { describe('flush/close', () => { test('client close function disables _sessionFlusher', async () => { jest.useRealTimers(); - const options = { + const options = getDefaultNodeClientOptions({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.1', - }; + }); const client = new NodeClient(options, setupNodeTransport(options).transport); client.initSessionFlusher(); // Clearing interval is important here to ensure that the flush function later on is called by the `client.close()` diff --git a/packages/node/test/index.test.ts b/packages/node/test/index.test.ts index 02eaad72b2c0..cf090240f70f 100644 --- a/packages/node/test/index.test.ts +++ b/packages/node/test/index.test.ts @@ -1,4 +1,4 @@ -import { initAndBind, SDK_VERSION } from '@sentry/core'; +import { initAndBind, SDK_VERSION, NoopTransport } from '@sentry/core'; import { getMainCarrier } from '@sentry/hub'; import { Integration } from '@sentry/types'; import { createStackParser } from '@sentry/utils'; @@ -19,6 +19,7 @@ import { import { ContextLines, LinkedErrors } from '../src/integrations'; import { nodeStackParser } from '../src/stack-parser'; import { setupNodeTransport } from '../src/transports'; +import { NodeClientOptions } from '../src/types'; const stackParser = createStackParser(nodeStackParser); @@ -30,6 +31,15 @@ jest.mock('@sentry/core', () => { }; }); +function getDefaultNodeClientOptions(options: Partial = {}): NodeClientOptions { + return { + integrations: [], + transport: NoopTransport, + stackParser: () => [], + ...options, + }; +} + const dsn = 'https://53039209a22b4ec1bcc296a3c9fdecd6@sentry.io/4291'; // eslint-disable-next-line no-var @@ -90,7 +100,7 @@ describe('SentryNode', () => { }); test('record auto breadcrumbs', done => { - const options = { + const options = getDefaultNodeClientOptions({ beforeSend: (event: Event) => { // TODO: It should be 3, but we don't capture a breadcrumb // for our own captureMessage/captureException calls yet @@ -100,7 +110,7 @@ describe('SentryNode', () => { }, dsn, stackParser, - }; + }); const client = new NodeClient(options, setupNodeTransport(options).transport); getCurrentHub().bindClient(client); addBreadcrumb({ message: 'test1' }); @@ -122,7 +132,7 @@ describe('SentryNode', () => { test('capture an exception', done => { expect.assertions(6); - const options = { + const options = getDefaultNodeClientOptions({ stackParser, beforeSend: (event: Event) => { expect(event.tags).toEqual({ test: '1' }); @@ -135,7 +145,7 @@ describe('SentryNode', () => { return null; }, dsn, - }; + }); getCurrentHub().bindClient(new NodeClient(options, setupNodeTransport(options).transport)); configureScope((scope: Scope) => { scope.setTag('test', '1'); @@ -149,7 +159,7 @@ describe('SentryNode', () => { test('capture a string exception', done => { expect.assertions(6); - const options = { + const options = getDefaultNodeClientOptions({ stackParser, beforeSend: (event: Event) => { expect(event.tags).toEqual({ test: '1' }); @@ -162,7 +172,7 @@ describe('SentryNode', () => { return null; }, dsn, - }; + }); getCurrentHub().bindClient(new NodeClient(options, setupNodeTransport(options).transport)); configureScope((scope: Scope) => { scope.setTag('test', '1'); @@ -176,7 +186,7 @@ describe('SentryNode', () => { test('capture an exception with pre/post context', done => { expect.assertions(10); - const options = { + const options = getDefaultNodeClientOptions({ stackParser, beforeSend: (event: Event) => { expect(event.tags).toEqual({ test: '1' }); @@ -193,7 +203,7 @@ describe('SentryNode', () => { return null; }, dsn, - }; + }); getCurrentHub().bindClient(new NodeClient(options, setupNodeTransport(options).transport)); configureScope((scope: Scope) => { scope.setTag('test', '1'); @@ -207,7 +217,7 @@ describe('SentryNode', () => { test('capture a linked exception with pre/post context', done => { expect.assertions(15); - const options = { + const options = getDefaultNodeClientOptions({ stackParser, integrations: [new ContextLines(), new LinkedErrors()], beforeSend: (event: Event) => { @@ -231,7 +241,7 @@ describe('SentryNode', () => { return null; }, dsn, - }; + }); getCurrentHub().bindClient(new NodeClient(options, setupNodeTransport(options).transport)); try { throw new Error('test'); @@ -247,7 +257,7 @@ describe('SentryNode', () => { test('capture a message', done => { expect.assertions(2); - const options = { + const options = getDefaultNodeClientOptions({ stackParser, beforeSend: (event: Event) => { expect(event.message).toBe('test'); @@ -256,14 +266,14 @@ describe('SentryNode', () => { return null; }, dsn, - }; + }); getCurrentHub().bindClient(new NodeClient(options, setupNodeTransport(options).transport)); captureMessage('test'); }); test('capture an event', done => { expect.assertions(2); - const options = { + const options = getDefaultNodeClientOptions({ stackParser, beforeSend: (event: Event) => { expect(event.message).toBe('test event'); @@ -272,7 +282,7 @@ describe('SentryNode', () => { return null; }, dsn, - }; + }); getCurrentHub().bindClient(new NodeClient(options, setupNodeTransport(options).transport)); captureEvent({ message: 'test event' }); }); @@ -280,7 +290,7 @@ describe('SentryNode', () => { test('capture an event in a domain', done => { const d = domain.create(); - const options = { + const options = getDefaultNodeClientOptions({ stackParser, beforeSend: (event: Event) => { expect(event.message).toBe('test domain'); @@ -289,7 +299,7 @@ describe('SentryNode', () => { return null; }, dsn, - }; + }); const client = new NodeClient(options, setupNodeTransport(options).transport); d.run(() => { @@ -301,7 +311,7 @@ describe('SentryNode', () => { test('stacktrace order', done => { expect.assertions(1); - const options = { + const options = getDefaultNodeClientOptions({ stackParser, beforeSend: (event: Event) => { expect( @@ -312,7 +322,7 @@ describe('SentryNode', () => { return null; }, dsn, - }; + }); getCurrentHub().bindClient(new NodeClient(options, setupNodeTransport(options).transport)); try { // @ts-ignore allow function declarations in strict mode @@ -376,7 +386,7 @@ describe('SentryNode initialization', () => { }); it('should set SDK data when instantiating a client directly', () => { - const options = { dsn }; + const options = getDefaultNodeClientOptions({ dsn }); const client = new NodeClient(options, setupNodeTransport(options).transport); // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/packages/node/test/integrations/http.test.ts b/packages/node/test/integrations/http.test.ts index f66f847cd298..4e0599bac161 100644 --- a/packages/node/test/integrations/http.test.ts +++ b/packages/node/test/integrations/http.test.ts @@ -12,16 +12,26 @@ import { Breadcrumb } from '../../src'; import { NodeClient } from '../../src/client'; import { Http as HttpIntegration } from '../../src/integrations/http'; import { setupNodeTransport } from '../../src/transports'; +import { NodeClientOptions } from '../../src/types'; const NODE_VERSION = parseSemver(process.versions.node); +function getDefaultNodeClientOptions(options: Partial = {}): NodeClientOptions { + return { + integrations: [], + transport: sentryCore.NoopTransport, + stackParser: () => [], + ...options, + }; +} + describe('tracing', () => { function createTransactionOnScope() { - const options = { + const options = getDefaultNodeClientOptions({ dsn: 'https://dogsarebadatkeepingsecrets@squirrelchasers.ingest.sentry.io/12312012', tracesSampleRate: 1.0, integrations: [new HttpIntegration({ tracing: true })], - }; + }); const hub = new Hub(new NodeClient(options, setupNodeTransport(options).transport)); addExtensionMethods(); @@ -97,7 +107,7 @@ describe('default protocols', () => { const p = new Promise(r => { resolve = r; }); - const options = { + const options = getDefaultNodeClientOptions({ dsn: 'https://dogsarebadatkeepingsecrets@squirrelchasers.ingest.sentry.io/12312012', integrations: [new HttpIntegration({ breadcrumbs: true })], beforeBreadcrumb: (b: Breadcrumb) => { @@ -106,7 +116,7 @@ describe('default protocols', () => { } return b; }, - }; + }); hub.bindClient(new NodeClient(options, setupNodeTransport(options).transport)); return p; diff --git a/packages/node/test/integrations/linkederrors.test.ts b/packages/node/test/integrations/linkederrors.test.ts index 2c2957bf6a69..1e8fb966a1e4 100644 --- a/packages/node/test/integrations/linkederrors.test.ts +++ b/packages/node/test/integrations/linkederrors.test.ts @@ -1,15 +1,26 @@ import { ExtendedError } from '@sentry/types'; import { createStackParser } from '@sentry/utils'; +import { NoopTransport } from '@sentry/core'; import { Event, NodeClient } from '../../src'; import { LinkedErrors } from '../../src/integrations/linkederrors'; import { nodeStackParser } from '../../src/stack-parser'; import { setupNodeTransport } from '../../src/transports'; +import { NodeClientOptions } from '../../src/types'; const stackParser = createStackParser(nodeStackParser); let linkedErrors: any; +function getDefaultNodeClientOptions(options: Partial = {}): NodeClientOptions { + return { + integrations: [], + transport: NoopTransport, + stackParser: () => [], + ...options, + }; +} + describe('LinkedErrors', () => { beforeEach(() => { linkedErrors = new LinkedErrors(); @@ -32,7 +43,7 @@ describe('LinkedErrors', () => { expect.assertions(2); const spy = jest.spyOn(linkedErrors, '_walkErrorTree'); const one = new Error('originalException'); - const options = { stackParser }; + const options = getDefaultNodeClientOptions({ stackParser }); const client = new NodeClient(options, setupNodeTransport(options).transport); let event: Event | undefined; return client @@ -56,7 +67,7 @@ describe('LinkedErrors', () => { }), ); const one = new Error('originalException'); - const options = { stackParser }; + const options = getDefaultNodeClientOptions({ stackParser }); const client = new NodeClient(options, setupNodeTransport(options).transport); return client.eventFromException(one).then(event => linkedErrors @@ -77,7 +88,7 @@ describe('LinkedErrors', () => { one.cause = two; two.cause = three; - const options = { stackParser }; + const options = getDefaultNodeClientOptions({ stackParser }); const client = new NodeClient(options, setupNodeTransport(options).transport); return client.eventFromException(one).then(event => linkedErrors @@ -111,7 +122,7 @@ describe('LinkedErrors', () => { one.reason = two; two.reason = three; - const options = { stackParser }; + const options = getDefaultNodeClientOptions({ stackParser }); const client = new NodeClient(options, setupNodeTransport(options).transport); return client.eventFromException(one).then(event => linkedErrors @@ -145,7 +156,7 @@ describe('LinkedErrors', () => { one.cause = two; two.cause = three; - const options = { stackParser }; + const options = getDefaultNodeClientOptions({ stackParser }); const client = new NodeClient(options, setupNodeTransport(options).transport); return client.eventFromException(one).then(event => linkedErrors diff --git a/packages/node/test/transports/setup.test.ts b/packages/node/test/transports/setup.test.ts index 6864ac89ea1e..e24bb2a9cfc3 100644 --- a/packages/node/test/transports/setup.test.ts +++ b/packages/node/test/transports/setup.test.ts @@ -3,6 +3,7 @@ import { FakeTransport } from '@sentry/core/test/mocks/transport'; import { HTTPSTransport, HTTPTransport, setupNodeTransport } from '@sentry/node/src/transports'; import { makeNodeTransport } from '../../src/transports/new'; +import { NodeClientOptions } from '../../src/types'; jest.mock('../../src/transports/new', () => { const original = jest.requireActual('../../src/transports/new'); @@ -15,6 +16,15 @@ jest.mock('../../src/transports/new', () => { }; }); +function getDefaultNodeClientOptions(options: Partial = {}): NodeClientOptions { + return { + integrations: [], + transport: NoopTransport, + stackParser: () => [], + ...options, + }; +} + const DSN = 'https://username@domain/123'; describe('setupNodeTransport', () => { @@ -31,7 +41,7 @@ describe('setupNodeTransport', () => { }); it('returns the instantiated transport passed via the options', () => { - const options = { dsn: DSN, transport: FakeTransport }; + const options = getDefaultNodeClientOptions({ dsn: DSN, transport: FakeTransport }); const { transport, newTransport } = setupNodeTransport(options); expect(transport).toBeDefined(); diff --git a/packages/tracing/test/errors.test.ts b/packages/tracing/test/errors.test.ts index c15825fd5480..e1491bf7d28f 100644 --- a/packages/tracing/test/errors.test.ts +++ b/packages/tracing/test/errors.test.ts @@ -5,6 +5,7 @@ import { InstrumentHandlerCallback, InstrumentHandlerType } from '@sentry/utils' import { registerErrorInstrumentation } from '../src/errors'; import { _addTracingExtensions } from '../src/hubextensions'; +import { NoopTransport } from '@sentry/core/src/transports/noop'; const mockAddInstrumentationHandler = jest.fn(); let mockErrorCallback: InstrumentHandlerCallback = () => undefined; @@ -35,7 +36,7 @@ describe('registerErrorHandlers()', () => { let hub: Hub; beforeEach(() => { mockAddInstrumentationHandler.mockClear(); - const options = { tracesSampleRate: 1 }; + const options = { tracesSampleRate: 1, transport: NoopTransport, integrations: [], stackParser: () => [] }; hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); }); From 50e93638af444cbf84ca98535e0ebf8dd5222a59 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 19 Apr 2022 12:42:13 +0200 Subject: [PATCH 22/33] rename `TestOptions -> TestClientOptions` --- packages/core/test/lib/base.test.ts | 132 ++++++++++++++-------------- packages/core/test/mocks/client.ts | 12 +-- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/packages/core/test/lib/base.test.ts b/packages/core/test/lib/base.test.ts index c795728364a4..76c428aafd92 100644 --- a/packages/core/test/lib/base.test.ts +++ b/packages/core/test/lib/base.test.ts @@ -4,7 +4,7 @@ import { dsnToString, logger, SentryError, SyncPromise } from '@sentry/utils'; import * as integrationModule from '../../src/integration'; import { NoopTransport } from '../../src/transports/noop'; -import { setupTestTransport, TestClient, getDefaultTestOptions } from '../mocks/client'; +import { setupTestTransport, TestClient, getDefaultTestClientOptions } from '../mocks/client'; import { TestIntegration } from '../mocks/integration'; import { FakeTransport } from '../mocks/transport'; @@ -67,7 +67,7 @@ describe('BaseClient', () => { test('returns the Dsn', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); expect(dsnToString(client.getDsn()!)).toBe(PUBLIC_DSN); }); @@ -75,7 +75,7 @@ describe('BaseClient', () => { test('allows missing Dsn', () => { expect.assertions(1); - const options = getDefaultTestOptions(); + const options = getDefaultTestClientOptions(); const client = new TestClient(options, setupTestTransport(options).transport); expect(client.getDsn()).toBeUndefined(); @@ -84,7 +84,7 @@ describe('BaseClient', () => { test('throws with invalid Dsn', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: 'abc' }); + const options = getDefaultTestClientOptions({ dsn: 'abc' }); expect(() => new TestClient(options, setupTestTransport(options).transport)).toThrow(SentryError); }); }); @@ -93,7 +93,7 @@ describe('BaseClient', () => { test('returns the options', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, test: true }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, test: true }); const client = new TestClient(options, setupTestTransport(options).transport); expect(client.getOptions()).toEqual(options); @@ -104,7 +104,7 @@ describe('BaseClient', () => { test('returns the transport from client', () => { expect.assertions(2); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, transport: FakeTransport }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, transport: FakeTransport }); const client = new TestClient(options, new FakeTransport()); expect(client.getTransport()).toBeInstanceOf(FakeTransport); @@ -114,7 +114,7 @@ describe('BaseClient', () => { test('retruns NoopTransport when no transport is passed', () => { expect.assertions(2); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); expect(client.getTransport()).toBeInstanceOf(NoopTransport); @@ -126,7 +126,7 @@ describe('BaseClient', () => { test('adds a breadcrumb', () => { expect.assertions(1); - const options = getDefaultTestOptions({}); + const options = getDefaultTestClientOptions({}); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -140,7 +140,7 @@ describe('BaseClient', () => { test('adds a timestamp to new breadcrumbs', () => { expect.assertions(1); - const options = getDefaultTestOptions({}); + const options = getDefaultTestClientOptions({}); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -154,7 +154,7 @@ describe('BaseClient', () => { test('discards breadcrumbs beyond maxBreadcrumbs', () => { expect.assertions(2); - const options = getDefaultTestOptions({ maxBreadcrumbs: 1 }); + const options = getDefaultTestClientOptions({ maxBreadcrumbs: 1 }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -169,7 +169,7 @@ describe('BaseClient', () => { test('allows concurrent updates', () => { expect.assertions(1); - const options = getDefaultTestOptions({}); + const options = getDefaultTestClientOptions({}); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -184,7 +184,7 @@ describe('BaseClient', () => { expect.assertions(1); const beforeBreadcrumb = jest.fn(breadcrumb => breadcrumb); - const options = getDefaultTestOptions({ beforeBreadcrumb }); + const options = getDefaultTestClientOptions({ beforeBreadcrumb }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -198,7 +198,7 @@ describe('BaseClient', () => { expect.assertions(1); const beforeBreadcrumb = jest.fn(() => ({ message: 'changed' })); - const options = getDefaultTestOptions({ beforeBreadcrumb }); + const options = getDefaultTestClientOptions({ beforeBreadcrumb }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -212,7 +212,7 @@ describe('BaseClient', () => { expect.assertions(1); const beforeBreadcrumb = jest.fn(() => null); - const options = getDefaultTestOptions({ beforeBreadcrumb }); + const options = getDefaultTestClientOptions({ beforeBreadcrumb }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -226,7 +226,7 @@ describe('BaseClient', () => { expect.assertions(2); const beforeBreadcrumb = jest.fn((breadcrumb, hint) => ({ ...breadcrumb, data: hint.data })); - const options = getDefaultTestOptions({ beforeBreadcrumb }); + const options = getDefaultTestClientOptions({ beforeBreadcrumb }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -240,7 +240,7 @@ describe('BaseClient', () => { describe('captureException', () => { test('captures and sends exceptions', () => { - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureException(new Error('test exception')); @@ -263,7 +263,7 @@ describe('BaseClient', () => { }); test('allows for providing explicit scope', () => { - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); scope.setExtra('foo', 'wat'); @@ -291,7 +291,7 @@ describe('BaseClient', () => { }); test('allows for clearing data from existing scope if explicit one does so in a callback function', () => { - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); scope.setExtra('foo', 'wat'); @@ -326,7 +326,7 @@ describe('BaseClient', () => { // already-seen check to work . Any primitive which is passed without being wrapped will be captured each time it // is encountered, so this test doesn't apply. ])("doesn't capture the same exception twice - %s", (_name: string, thrown: any) => { - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); expect(thrown.__sentry_captured__).toBeUndefined(); @@ -345,7 +345,7 @@ describe('BaseClient', () => { describe('captureMessage', () => { test('captures and sends messages', () => { - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureMessage('test message'); @@ -362,7 +362,7 @@ describe('BaseClient', () => { }); test('should call eventFromException if input to captureMessage is not a primitive', () => { - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const spy = jest.spyOn(TestClient.instance!, 'eventFromException'); @@ -381,7 +381,7 @@ describe('BaseClient', () => { }); test('allows for providing explicit scope', () => { - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); scope.setExtra('foo', 'wat'); @@ -415,7 +415,7 @@ describe('BaseClient', () => { test('skips when disabled', () => { expect.assertions(1); - const options = getDefaultTestOptions({ enabled: false, dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ enabled: false, dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -427,7 +427,7 @@ describe('BaseClient', () => { test('skips without a Dsn', () => { expect.assertions(1); - const options = getDefaultTestOptions({}); + const options = getDefaultTestClientOptions({}); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -445,7 +445,7 @@ describe('BaseClient', () => { // already-seen check to work . Any primitive which is passed without being wrapped will be captured each time it // is encountered, so this test doesn't apply. ])("doesn't capture an event wrapping the same exception twice - %s", (_name: string, thrown: any) => { - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); // Note: this is the same test as in `describe(captureException)`, except with the exception already wrapped in a // hint and accompanying an event. Duplicated here because some methods skip `captureException` and go straight to // `captureEvent`. @@ -469,7 +469,7 @@ describe('BaseClient', () => { test('sends an event', () => { expect.assertions(2); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -489,7 +489,7 @@ describe('BaseClient', () => { test('does not overwrite existing timestamp', () => { expect.assertions(2); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -509,7 +509,7 @@ describe('BaseClient', () => { test('adds event_id from hint if available', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -528,7 +528,7 @@ describe('BaseClient', () => { test('sets default environment to `production` if none provided', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -547,7 +547,7 @@ describe('BaseClient', () => { test('adds the configured environment', () => { expect.assertions(1); - const options = getDefaultTestOptions({ environment: 'env', dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ environment: 'env', dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -566,7 +566,7 @@ describe('BaseClient', () => { test('allows for environment to be explicitly set to falsy value', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, environment: undefined }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, environment: undefined }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -585,7 +585,7 @@ describe('BaseClient', () => { test('adds the configured release', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, release: 'v1.0.0' }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, release: 'v1.0.0' }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); @@ -605,7 +605,7 @@ describe('BaseClient', () => { test('adds breadcrumbs', () => { expect.assertions(4); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); scope.addBreadcrumb({ message: 'breadcrumb' }, 100); @@ -621,7 +621,7 @@ describe('BaseClient', () => { test('limits previously saved breadcrumbs', () => { expect.assertions(2); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, maxBreadcrumbs: 1 }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, maxBreadcrumbs: 1 }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); const hub = new Hub(client, scope); @@ -637,7 +637,7 @@ describe('BaseClient', () => { test('adds context data', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); scope.setExtra('b', 'b'); @@ -662,7 +662,7 @@ describe('BaseClient', () => { test('adds fingerprint', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const scope = new Scope(); scope.setFingerprint(['abcd']); @@ -681,7 +681,7 @@ describe('BaseClient', () => { }); test('adds installed integrations to sdk info', () => { - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, integrations: [new TestIntegration()] }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, integrations: [new TestIntegration()] }); const client = new TestClient(options, setupTestTransport(options).transport); client.setupIntegrations(); @@ -695,7 +695,7 @@ describe('BaseClient', () => { test('normalizes event with default depth of 3', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const fourLevelsObject = { a: { @@ -747,7 +747,7 @@ describe('BaseClient', () => { test('normalization respects `normalizeDepth` option', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, normalizeDepth: 2 }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, normalizeDepth: 2 }); const client = new TestClient(options, setupTestTransport(options).transport); const fourLevelsObject = { a: { @@ -796,7 +796,7 @@ describe('BaseClient', () => { test('skips normalization when `normalizeDepth: 0`', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, normalizeDepth: 0 }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, normalizeDepth: 0 }); const client = new TestClient(options, setupTestTransport(options).transport); const fourLevelsObject = { a: { @@ -850,7 +850,7 @@ describe('BaseClient', () => { test('normalization applies to Transaction and Span consistently', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const transaction: Event = { contexts: { @@ -925,7 +925,7 @@ describe('BaseClient', () => { expect.assertions(1); const beforeSend = jest.fn(event => event); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, beforeSend }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureEvent({ message: 'hello' }); @@ -937,7 +937,7 @@ describe('BaseClient', () => { expect.assertions(1); const beforeSend = jest.fn(() => ({ message: 'changed1' })); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, beforeSend }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureEvent({ message: 'hello' }); @@ -949,7 +949,7 @@ describe('BaseClient', () => { expect.assertions(3); const beforeSend = jest.fn(() => null); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, beforeSend }); const client = new TestClient(options, setupTestTransport(options).transport); const captureExceptionSpy = jest.spyOn(client, 'captureException'); const loggerErrorSpy = jest.spyOn(logger, 'error'); @@ -968,7 +968,7 @@ describe('BaseClient', () => { for (const val of invalidValues) { const beforeSend = jest.fn(() => val); // @ts-ignore we need to test regular-js behavior - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, beforeSend }); const client = new TestClient(options, setupTestTransport(options).transport); const loggerErrorSpy = jest.spyOn(logger, 'error'); @@ -993,7 +993,7 @@ describe('BaseClient', () => { }, 1); }), ); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, beforeSend }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureEvent({ message: 'hello' }); @@ -1022,7 +1022,7 @@ describe('BaseClient', () => { }, 1); }), ); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, beforeSend }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureEvent({ message: 'hello' }); @@ -1051,7 +1051,7 @@ describe('BaseClient', () => { }); }), ); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, beforeSend }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureEvent({ message: 'hello' }); @@ -1064,7 +1064,7 @@ describe('BaseClient', () => { expect.assertions(2); const beforeSend = jest.fn((event, hint) => ({ ...event, data: hint.data })); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, beforeSend }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, beforeSend }); const client = new TestClient(options, setupTestTransport(options).transport); client.captureEvent({ message: 'hello' }, { data: 'someRandomThing' }); @@ -1077,13 +1077,13 @@ describe('BaseClient', () => { expect.assertions(1); const client = new TestClient( - getDefaultTestOptions({ + getDefaultTestClientOptions({ dsn: PUBLIC_DSN, beforeSend() { return null; }, }), - setupTestTransport(getDefaultTestOptions({ dsn: PUBLIC_DSN })).transport, + setupTestTransport(getDefaultTestClientOptions({ dsn: PUBLIC_DSN })).transport, ); const recordLostEventSpy = jest.fn(); jest.spyOn(client, 'getTransport').mockImplementationOnce( @@ -1102,8 +1102,8 @@ describe('BaseClient', () => { expect.assertions(3); const client = new TestClient( - getDefaultTestOptions({ dsn: PUBLIC_DSN }), - setupTestTransport(getDefaultTestOptions({ dsn: PUBLIC_DSN })).transport, + getDefaultTestClientOptions({ dsn: PUBLIC_DSN }), + setupTestTransport(getDefaultTestClientOptions({ dsn: PUBLIC_DSN })).transport, ); const captureExceptionSpy = jest.spyOn(client, 'captureException'); const loggerErrorSpy = jest.spyOn(logger, 'error'); @@ -1120,7 +1120,7 @@ describe('BaseClient', () => { test('eventProcessor records dropped events', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const recordLostEventSpy = jest.fn(); @@ -1142,7 +1142,7 @@ describe('BaseClient', () => { test('eventProcessor sends an event and logs when it crashes', () => { expect.assertions(3); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const captureExceptionSpy = jest.spyOn(client, 'captureException'); const loggerErrorSpy = jest.spyOn(logger, 'error'); @@ -1171,7 +1171,7 @@ describe('BaseClient', () => { test('records events dropped due to sampleRate', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, sampleRate: 0 }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, sampleRate: 0 }); const client = new TestClient(options, setupTestTransport(options).transport); const recordLostEventSpy = jest.fn(); @@ -1195,7 +1195,7 @@ describe('BaseClient', () => { test('setup each one of them on setupIntegration call', () => { expect.assertions(2); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, integrations: [new TestIntegration()] }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, integrations: [new TestIntegration()] }); const client = new TestClient(options, setupTestTransport(options).transport); client.setupIntegrations(); @@ -1206,7 +1206,7 @@ describe('BaseClient', () => { test('skips installation if DSN is not provided', () => { expect.assertions(2); - const options = getDefaultTestOptions({ integrations: [new TestIntegration()] }); + const options = getDefaultTestClientOptions({ integrations: [new TestIntegration()] }); const client = new TestClient(options, setupTestTransport(options).transport); client.setupIntegrations(); @@ -1217,7 +1217,7 @@ describe('BaseClient', () => { test('skips installation if enabled is set to false', () => { expect.assertions(2); - const options = getDefaultTestOptions({ + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, enabled: false, integrations: [new TestIntegration()], @@ -1232,7 +1232,7 @@ describe('BaseClient', () => { test('skips installation if integrations are already installed', () => { expect.assertions(4); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, integrations: [new TestIntegration()] }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, integrations: [new TestIntegration()] }); const client = new TestClient(options, setupTestTransport(options).transport); // note: not the `Client` method `setupIntegrations`, but the free-standing function which that method calls const setupIntegrationsHelper = jest.spyOn(integrationModule, 'setupIntegrations'); @@ -1257,7 +1257,7 @@ describe('BaseClient', () => { expect.assertions(5); const client = new TestClient( - getDefaultTestOptions({ + getDefaultTestClientOptions({ dsn: PUBLIC_DSN, enableSend: true, transport: FakeTransport, @@ -1286,7 +1286,7 @@ describe('BaseClient', () => { expect.assertions(5); const client = new TestClient( - getDefaultTestOptions({ + getDefaultTestClientOptions({ dsn: PUBLIC_DSN, enableSend: true, transport: FakeTransport, @@ -1325,7 +1325,7 @@ describe('BaseClient', () => { expect.assertions(2); const client = new TestClient( - getDefaultTestOptions({ + getDefaultTestClientOptions({ dsn: PUBLIC_DSN, enableSend: true, transport: FakeTransport, @@ -1349,7 +1349,7 @@ describe('BaseClient', () => { jest.useRealTimers(); expect.assertions(3); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); return Promise.all([ @@ -1370,7 +1370,7 @@ describe('BaseClient', () => { test('sends sessions to the client', () => { expect.assertions(1); - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const session = new Session({ release: 'test' }); @@ -1382,7 +1382,7 @@ describe('BaseClient', () => { test('skips when disabled', () => { expect.assertions(1); - const options = getDefaultTestOptions({ enabled: false, dsn: PUBLIC_DSN }); + const options = getDefaultTestClientOptions({ enabled: false, dsn: PUBLIC_DSN }); const client = new TestClient(options, setupTestTransport(options).transport); const session = new Session({ release: 'test' }); diff --git a/packages/core/test/mocks/client.ts b/packages/core/test/mocks/client.ts index bb208c2ddbe8..5778dcf5e193 100644 --- a/packages/core/test/mocks/client.ts +++ b/packages/core/test/mocks/client.ts @@ -7,7 +7,7 @@ import { initAndBind } from '../../src/sdk'; import { NewTransport } from '../../src/transports/base'; import { NoopTransport } from '../../src/transports/noop'; -export function getDefaultTestOptions(options: Partial = {}): TestOptions { +export function getDefaultTestClientOptions(options: Partial = {}): TestClientOptions { return { integrations: [], transport: NoopTransport, @@ -16,21 +16,21 @@ export function getDefaultTestOptions(options: Partial = {}): TestO }; } -export interface TestOptions extends ClientOptions { +export interface TestClientOptions extends ClientOptions { test?: boolean; mockInstallFailure?: boolean; enableSend?: boolean; defaultIntegrations?: Integration[] | false; } -export class TestClient extends BaseClient { +export class TestClient extends BaseClient { public static instance?: TestClient; public static sendEventCalled?: (event: Event) => void; public event?: Event; public session?: Session; - public constructor(options: TestOptions, transport: Transport, newTransport?: NewTransport) { + public constructor(options: TestClientOptions, transport: Transport, newTransport?: NewTransport) { super(options, transport, newTransport); TestClient.instance = this; } @@ -74,11 +74,11 @@ export class TestClient extends BaseClient { } } -export function init(options: TestOptions, transport: Transport, newTransport?: NewTransport): void { +export function init(options: TestClientOptions, transport: Transport, newTransport?: NewTransport): void { initAndBind(TestClient, options, transport, newTransport); } -export function setupTestTransport(options: TestOptions): { transport: Transport; newTransport?: NewTransport } { +export function setupTestTransport(options: TestClientOptions): { transport: Transport; newTransport?: NewTransport } { const noop = { transport: new NoopTransport() }; if (!options.dsn) { From 94df6812314cadebd84f5aaf966af91d3959d70c Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 19 Apr 2022 12:44:21 +0200 Subject: [PATCH 23/33] tmp fix core `sdk.test.ts` --- packages/core/test/lib/sdk.test.ts | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/core/test/lib/sdk.test.ts b/packages/core/test/lib/sdk.test.ts index 8b59afdedee5..087d04584ed7 100644 --- a/packages/core/test/lib/sdk.test.ts +++ b/packages/core/test/lib/sdk.test.ts @@ -1,9 +1,9 @@ import { Scope } from '@sentry/hub'; import { Client, Integration } from '@sentry/types'; -import { installedIntegrations } from '../../src/integration'; +import { getIntegrationsToSetup, installedIntegrations } from '../../src/integration'; import { initAndBind } from '../../src/sdk'; -import { setupTestTransport, TestClient, TestOptions, getDefaultTestOptions } from '../mocks/client'; +import { setupTestTransport, TestClient, getDefaultTestClientOptions } from '../mocks/client'; // eslint-disable-next-line no-var declare var global: any; @@ -55,7 +55,7 @@ describe('SDK', () => { new MockIntegration('MockIntegration 1'), new MockIntegration('MockIntegration 2'), ]; - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, defaultIntegrations: DEFAULT_INTEGRATIONS }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, integrations: DEFAULT_INTEGRATIONS }); initAndBind(TestClient, options, setupTestTransport(options).transport); expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(1); expect((DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).mock.calls.length).toBe(1); @@ -66,7 +66,7 @@ describe('SDK', () => { new MockIntegration('MockIntegration 1'), new MockIntegration('MockIntegration 2'), ]; - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, defaultIntegrations: false }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, defaultIntegrations: false }); initAndBind(TestClient, options, setupTestTransport(options).transport); expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(0); expect((DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).mock.calls.length).toBe(0); @@ -77,12 +77,13 @@ describe('SDK', () => { new MockIntegration('MockIntegration 1'), new MockIntegration('MockIntegration 2'), ]; - const options = getDefaultTestOptions({ dsn: PUBLIC_DSN, integrations }); + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, integrations }); initAndBind(TestClient, options, setupTestTransport(options).transport); expect((integrations[0].setupOnce as jest.Mock).mock.calls.length).toBe(1); expect((integrations[1].setupOnce as jest.Mock).mock.calls.length).toBe(1); }); + // TODO: test('installs merged default integrations, with overrides provided through options', () => { const DEFAULT_INTEGRATIONS: Integration[] = [ new MockIntegration('MockIntegration 1'), @@ -92,11 +93,13 @@ describe('SDK', () => { new MockIntegration('MockIntegration 1'), new MockIntegration('MockIntegration 3'), ]; - const options = getDefaultTestOptions({ + const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, defaultIntegrations: DEFAULT_INTEGRATIONS, integrations, }); + options.integrations = getIntegrationsToSetup(options); + initAndBind(TestClient, options, setupTestTransport(options).transport); // 'MockIntegration 1' should be overridden by the one with the same name provided through options expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(0); @@ -105,16 +108,16 @@ describe('SDK', () => { expect((integrations[1].setupOnce as jest.Mock).mock.calls.length).toBe(1); }); - test('installs integrations returned from a callback function', () => { + test.skip('installs integrations returned from a callback function', () => { const DEFAULT_INTEGRATIONS: Integration[] = [ new MockIntegration('MockIntegration 1'), new MockIntegration('MockIntegration 2'), ]; const newIntegration = new MockIntegration('MockIntegration 3'); - const options = getDefaultTestOptions({ + const options = getDefaultTestClientOptions({ defaultIntegrations: DEFAULT_INTEGRATIONS, dsn: PUBLIC_DSN, - integrations: (integrations: Integration[]) => integrations.slice(0, 1).concat(newIntegration), + // integrations: (integrations: Integration[]) => integrations.slice(0, 1).concat(newIntegration), }); initAndBind(TestClient, options, setupTestTransport(options).transport); expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(1); From 68165d5ebf6c1942622b853e04ba7674361b06fb Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 19 Apr 2022 12:29:15 +0000 Subject: [PATCH 24/33] Add tests for integration setup in node init --- packages/node/test/sdk.test.ts | 91 ++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 packages/node/test/sdk.test.ts diff --git a/packages/node/test/sdk.test.ts b/packages/node/test/sdk.test.ts new file mode 100644 index 000000000000..56a28bb81c27 --- /dev/null +++ b/packages/node/test/sdk.test.ts @@ -0,0 +1,91 @@ +import { Integration } from '@sentry/types'; +import { init } from '../src/sdk'; +import * as sdk from '../src/sdk'; + +// eslint-disable-next-line no-var +declare var global: any; + +const PUBLIC_DSN = 'https://username@domain/123'; + +class MockIntegration implements Integration { + public name: string; + public setupOnce = jest.fn(); + public constructor(name: string) { + this.name = name; + } +} + +const defaultIntegrationsBackup = sdk.defaultIntegrations; + +describe('init()', () => { + beforeEach(() => { + global.__SENTRY__ = {}; + }); + + afterEach(() => { + // @ts-ignore + sdk.defaultIntegrations = defaultIntegrationsBackup; + }); + + it("doesn't install default integrations if told not to", () => { + const mockDefaultIntegrations = [ + new MockIntegration('Mock integration 1.1'), + new MockIntegration('Mock integration 1.2'), + ]; + + //@ts-ignore + sdk.defaultIntegrations = mockDefaultIntegrations; + + init({ dsn: PUBLIC_DSN, defaultIntegrations: false }); + + expect(mockDefaultIntegrations[0].setupOnce as jest.Mock).toHaveBeenCalledTimes(0); + expect(mockDefaultIntegrations[1].setupOnce as jest.Mock).toHaveBeenCalledTimes(0); + }); + + it('installs merged default integrations, with overrides provided through options', () => { + const mockDefaultIntegrations = [ + new MockIntegration('Some mock integration 2.1'), + new MockIntegration('Some mock integration 2.2'), + ]; + + //@ts-ignore + sdk.defaultIntegrations = mockDefaultIntegrations; + + const mockIntegrations = [ + new MockIntegration('Some mock integration 2.1'), + new MockIntegration('Some mock integration 2.3'), + ]; + + init({ dsn: PUBLIC_DSN, integrations: mockIntegrations }); + + expect(mockDefaultIntegrations[0].setupOnce as jest.Mock).toHaveBeenCalledTimes(0); + expect(mockDefaultIntegrations[1].setupOnce as jest.Mock).toHaveBeenCalledTimes(1); + expect(mockIntegrations[0].setupOnce as jest.Mock).toHaveBeenCalledTimes(1); + expect(mockIntegrations[1].setupOnce as jest.Mock).toHaveBeenCalledTimes(1); + }); + + it('installs integrations returned from a callback function', () => { + const mockDefaultIntegrations = [ + new MockIntegration('Some mock integration 3.1'), + new MockIntegration('Some mock integration 3.2'), + ]; + + //@ts-ignore + sdk.defaultIntegrations = mockDefaultIntegrations; + + const newIntegration = new MockIntegration('Some mock integration 3.3'); + + init({ + dsn: PUBLIC_DSN, + integrations: integrations => { + const newIntegrations = [...integrations]; + newIntegrations[1] = newIntegration; + return newIntegrations; + }, + }); + + expect(mockDefaultIntegrations[0].setupOnce as jest.Mock).toHaveBeenCalledTimes(1); + expect(mockDefaultIntegrations[1].setupOnce as jest.Mock).toHaveBeenCalledTimes(0); + expect(newIntegration.setupOnce as jest.Mock).toHaveBeenCalledTimes(1); + }); +}); From 9371d485bfa47e900c8001c9954afc9673e24c72 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 19 Apr 2022 12:31:07 +0000 Subject: [PATCH 25/33] Further fix node tests --- packages/node/test/handlers.test.ts | 30 +++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/packages/node/test/handlers.test.ts b/packages/node/test/handlers.test.ts index d7d47fda053d..3830ab8c0376 100644 --- a/packages/node/test/handlers.test.ts +++ b/packages/node/test/handlers.test.ts @@ -19,6 +19,16 @@ import { } from '../src/handlers'; import * as SDK from '../src/sdk'; import { setupNodeTransport } from '../src/transports'; +import { NodeClientOptions } from '../src/types'; + +function getDefaultNodeClientOptions(options: Partial = {}): NodeClientOptions { + return { + integrations: [], + transport: sentryCore.NoopTransport, + stackParser: () => [], + ...options, + }; +} describe('parseRequest', () => { let mockReq: { [key: string]: any }; @@ -224,7 +234,7 @@ describe('requestHandler', () => { }); it('autoSessionTracking is enabled, sets requestSession status to ok, when handling a request', () => { - const options = { autoSessionTracking: true, release: '1.2' }; + const options = getDefaultNodeClientOptions({ autoSessionTracking: true, release: '1.2' }); client = new NodeClient(options, setupNodeTransport(options).transport); const hub = new Hub(client); @@ -237,7 +247,7 @@ describe('requestHandler', () => { }); it('autoSessionTracking is disabled, does not set requestSession, when handling a request', () => { - const options = { autoSessionTracking: false, release: '1.2' }; + const options = getDefaultNodeClientOptions({ autoSessionTracking: false, release: '1.2' }); client = new NodeClient(options, setupNodeTransport(options).transport); const hub = new Hub(client); @@ -250,7 +260,7 @@ describe('requestHandler', () => { }); it('autoSessionTracking is enabled, calls _captureRequestSession, on response finish', done => { - const options = { autoSessionTracking: true, release: '1.2' }; + const options = getDefaultNodeClientOptions({ autoSessionTracking: true, release: '1.2' }); client = new NodeClient(options, setupNodeTransport(options).transport); const hub = new Hub(client); @@ -271,7 +281,7 @@ describe('requestHandler', () => { }); it('autoSessionTracking is disabled, does not call _captureRequestSession, on response finish', done => { - const options = { autoSessionTracking: false, release: '1.2' }; + const options = getDefaultNodeClientOptions({ autoSessionTracking: false, release: '1.2' }); client = new NodeClient(options, setupNodeTransport(options).transport); const hub = new Hub(client); jest.spyOn(sentryCore, 'getCurrentHub').mockReturnValue(hub); @@ -372,7 +382,7 @@ describe('tracingHandler', () => { it('extracts request data for sampling context', () => { const tracesSampler = jest.fn(); - const options = { tracesSampler }; + const options = getDefaultNodeClientOptions({ tracesSampler }); const hub = new Hub(new NodeClient(options, setupNodeTransport(options).transport)); // we need to mock both of these because the tracing handler relies on `@sentry/core` while the sampler relies on // `@sentry/hub`, and mocking breaks the link between the two @@ -395,7 +405,7 @@ describe('tracingHandler', () => { }); it('puts its transaction on the scope', () => { - const options = { tracesSampleRate: 1.0 }; + const options = getDefaultNodeClientOptions({ tracesSampleRate: 1.0 }); const hub = new Hub(new NodeClient(options, setupNodeTransport(options).transport)); // we need to mock both of these because the tracing handler relies on `@sentry/core` while the sampler relies on // `@sentry/hub`, and mocking breaks the link between the two @@ -727,7 +737,7 @@ describe('errorHandler()', () => { jest.restoreAllMocks(); }); it('when autoSessionTracking is disabled, does not set requestSession status on Crash', () => { - const options = { autoSessionTracking: false, release: '3.3' }; + const options = getDefaultNodeClientOptions({ autoSessionTracking: false, release: '3.3' }); client = new NodeClient(options, setupNodeTransport(options).transport); // It is required to initialise SessionFlusher to capture Session Aggregates (it is usually initialised // by the`requestHandler`) @@ -747,7 +757,7 @@ describe('errorHandler()', () => { }); it('autoSessionTracking is enabled + requestHandler is not used -> does not set requestSession status on Crash', () => { - const options = { autoSessionTracking: false, release: '3.3' }; + const options = getDefaultNodeClientOptions({ autoSessionTracking: false, release: '3.3' }); client = new NodeClient(options, setupNodeTransport(options).transport); const scope = sentryCore.getCurrentHub().getScope(); @@ -764,7 +774,7 @@ describe('errorHandler()', () => { }); it('when autoSessionTracking is enabled, should set requestSession status to Crashed when an unhandled error occurs within the bounds of a request', () => { - const options = { autoSessionTracking: true, release: '1.1' }; + const options = getDefaultNodeClientOptions({ autoSessionTracking: true, release: '1.1' }); client = new NodeClient(options, setupNodeTransport(options).transport); // It is required to initialise SessionFlusher to capture Session Aggregates (it is usually initialised // by the`requestHandler`) @@ -783,7 +793,7 @@ describe('errorHandler()', () => { }); it('when autoSessionTracking is enabled, should not set requestSession status on Crash when it occurs outside the bounds of a request', () => { - const options = { autoSessionTracking: true, release: '2.2' }; + const options = getDefaultNodeClientOptions({ autoSessionTracking: true, release: '2.2' }); client = new NodeClient(options, setupNodeTransport(options).transport); // It is required to initialise SessionFlusher to capture Session Aggregates (it is usually initialised // by the`requestHandler`) From ba6170758f2546d4e16ba39fbdbca7840f4c4a09 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 19 Apr 2022 14:35:57 +0200 Subject: [PATCH 26/33] add tests for integration setup in browser init --- packages/browser/test/unit/sdk.test.ts | 127 +++++++++++++++++++++++++ packages/core/test/lib/sdk.test.ts | 68 +------------ 2 files changed, 129 insertions(+), 66 deletions(-) create mode 100644 packages/browser/test/unit/sdk.test.ts diff --git a/packages/browser/test/unit/sdk.test.ts b/packages/browser/test/unit/sdk.test.ts new file mode 100644 index 000000000000..55f6cae2131a --- /dev/null +++ b/packages/browser/test/unit/sdk.test.ts @@ -0,0 +1,127 @@ +import { NoopTransport, Scope } from '@sentry/core'; +import { Client, Integration } from '@sentry/types'; +import { BrowserOptions } from '../../src/client'; + +import { MockIntegration } from '@sentry/core/test/lib/sdk.test'; + +import { init } from '../../src/sdk'; +// eslint-disable-next-line no-var +declare var global: any; + +const PUBLIC_DSN = 'https://username@domain/123'; + +function getDefaultBrowserOptions(options: Partial = {}): BrowserOptions { + return { + integrations: [], + transport: NoopTransport, + stackParser: () => [], + ...options, + }; +} + +jest.mock('@sentry/hub', () => { + const original = jest.requireActual('@sentry/hub'); + return { + ...original, + getCurrentHub(): { + bindClient(client: Client): boolean; + getClient(): boolean; + getScope(): Scope; + } { + return { + getClient(): boolean { + return false; + }, + getScope(): Scope { + return new Scope(); + }, + bindClient(client: Client): boolean { + client.setupIntegrations(); + return true; + }, + }; + }, + }; +}); + +describe('init', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + afterAll(() => { + jest.resetAllMocks(); + }); + + test('installs default integrations', () => { + const DEFAULT_INTEGRATIONS: Integration[] = [ + new MockIntegration('MockIntegration 0.1'), + new MockIntegration('MockIntegration 0.2'), + ]; + const options = getDefaultBrowserOptions({ dsn: PUBLIC_DSN, defaultIntegrations: DEFAULT_INTEGRATIONS }); + + init(options); + + expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(1); + expect((DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).mock.calls.length).toBe(1); + }); + + test("doesn't install default integrations if told not to", () => { + const DEFAULT_INTEGRATIONS: Integration[] = [ + new MockIntegration('MockIntegration 0.3'), + new MockIntegration('MockIntegration 0.4'), + ]; + const options = getDefaultBrowserOptions({ dsn: PUBLIC_DSN, defaultIntegrations: false }); + init(options); + + expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(0); + expect((DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).mock.calls.length).toBe(0); + }); + + it('installs merged default integrations, with overrides provided through options', () => { + const DEFAULT_INTEGRATIONS: Integration[] = [ + new MockIntegration('MockIntegration 1.1'), + new MockIntegration('MockIntegration 1.2'), + ]; + + const integrations: Integration[] = [ + new MockIntegration('MockIntegration 1.1'), + new MockIntegration('MockIntegration 1.3'), + ]; + const options = getDefaultBrowserOptions({ + dsn: PUBLIC_DSN, + defaultIntegrations: DEFAULT_INTEGRATIONS, + integrations, + }); + + init(options); + // 'MockIntegration 1' should be overridden by the one with the same name provided through options + expect(DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).toHaveBeenCalledTimes(0); + expect(DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).toHaveBeenCalledTimes(1); + expect(integrations[0].setupOnce as jest.Mock).toHaveBeenCalledTimes(1); + expect(integrations[1].setupOnce as jest.Mock).toHaveBeenCalledTimes(1); + }); + + it('installs integrations returned from a callback function', () => { + const DEFAULT_INTEGRATIONS: Integration[] = [ + new MockIntegration('MockIntegration 2.1'), + new MockIntegration('MockIntegration 2.2'), + ]; + + const newIntegration = new MockIntegration('MockIntegration 2.3'); + const options = getDefaultBrowserOptions({ + defaultIntegrations: DEFAULT_INTEGRATIONS, + dsn: PUBLIC_DSN, + integrations: (integrations: Integration[]) => { + const t = integrations.slice(0, 1).concat(newIntegration); + return t; + }, + }); + + init(options); + + expect(DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).toHaveBeenCalledTimes(1); + expect(newIntegration.setupOnce as jest.Mock).toHaveBeenCalledTimes(1); + expect(DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).toHaveBeenCalledTimes(0); + }); +}); diff --git a/packages/core/test/lib/sdk.test.ts b/packages/core/test/lib/sdk.test.ts index 087d04584ed7..c58da346a310 100644 --- a/packages/core/test/lib/sdk.test.ts +++ b/packages/core/test/lib/sdk.test.ts @@ -1,7 +1,7 @@ import { Scope } from '@sentry/hub'; import { Client, Integration } from '@sentry/types'; -import { getIntegrationsToSetup, installedIntegrations } from '../../src/integration'; +import { installedIntegrations } from '../../src/integration'; import { initAndBind } from '../../src/sdk'; import { setupTestTransport, TestClient, getDefaultTestClientOptions } from '../mocks/client'; @@ -35,7 +35,7 @@ jest.mock('@sentry/hub', () => { }; }); -class MockIntegration implements Integration { +export class MockIntegration implements Integration { public name: string; public setupOnce: () => void = jest.fn(); public constructor(name: string) { @@ -50,28 +50,6 @@ describe('SDK', () => { }); describe('initAndBind', () => { - test('installs default integrations', () => { - const DEFAULT_INTEGRATIONS: Integration[] = [ - new MockIntegration('MockIntegration 1'), - new MockIntegration('MockIntegration 2'), - ]; - const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, integrations: DEFAULT_INTEGRATIONS }); - initAndBind(TestClient, options, setupTestTransport(options).transport); - expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(1); - expect((DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).mock.calls.length).toBe(1); - }); - - test("doesn't install default integrations if told not to", () => { - const DEFAULT_INTEGRATIONS: Integration[] = [ - new MockIntegration('MockIntegration 1'), - new MockIntegration('MockIntegration 2'), - ]; - const options = getDefaultTestClientOptions({ dsn: PUBLIC_DSN, defaultIntegrations: false }); - initAndBind(TestClient, options, setupTestTransport(options).transport); - expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(0); - expect((DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).mock.calls.length).toBe(0); - }); - test('installs integrations provided through options', () => { const integrations: Integration[] = [ new MockIntegration('MockIntegration 1'), @@ -82,47 +60,5 @@ describe('SDK', () => { expect((integrations[0].setupOnce as jest.Mock).mock.calls.length).toBe(1); expect((integrations[1].setupOnce as jest.Mock).mock.calls.length).toBe(1); }); - - // TODO: - test('installs merged default integrations, with overrides provided through options', () => { - const DEFAULT_INTEGRATIONS: Integration[] = [ - new MockIntegration('MockIntegration 1'), - new MockIntegration('MockIntegration 2'), - ]; - const integrations: Integration[] = [ - new MockIntegration('MockIntegration 1'), - new MockIntegration('MockIntegration 3'), - ]; - const options = getDefaultTestClientOptions({ - dsn: PUBLIC_DSN, - defaultIntegrations: DEFAULT_INTEGRATIONS, - integrations, - }); - options.integrations = getIntegrationsToSetup(options); - - initAndBind(TestClient, options, setupTestTransport(options).transport); - // 'MockIntegration 1' should be overridden by the one with the same name provided through options - expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(0); - expect((DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).mock.calls.length).toBe(1); - expect((integrations[0].setupOnce as jest.Mock).mock.calls.length).toBe(1); - expect((integrations[1].setupOnce as jest.Mock).mock.calls.length).toBe(1); - }); - - test.skip('installs integrations returned from a callback function', () => { - const DEFAULT_INTEGRATIONS: Integration[] = [ - new MockIntegration('MockIntegration 1'), - new MockIntegration('MockIntegration 2'), - ]; - const newIntegration = new MockIntegration('MockIntegration 3'); - const options = getDefaultTestClientOptions({ - defaultIntegrations: DEFAULT_INTEGRATIONS, - dsn: PUBLIC_DSN, - // integrations: (integrations: Integration[]) => integrations.slice(0, 1).concat(newIntegration), - }); - initAndBind(TestClient, options, setupTestTransport(options).transport); - expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(1); - expect((newIntegration.setupOnce as jest.Mock).mock.calls.length).toBe(1); - expect((DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).mock.calls.length).toBe(0); - }); }); }); From 957452f136eace902cc483c4943ae0a32ce2b3e8 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 19 Apr 2022 12:39:39 +0000 Subject: [PATCH 27/33] Fix some eslint errors in node tests --- packages/node/test/sdk.test.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/node/test/sdk.test.ts b/packages/node/test/sdk.test.ts index 56a28bb81c27..48e5accee439 100644 --- a/packages/node/test/sdk.test.ts +++ b/packages/node/test/sdk.test.ts @@ -1,4 +1,5 @@ import { Integration } from '@sentry/types'; + import { init } from '../src/sdk'; import * as sdk from '../src/sdk'; @@ -9,7 +10,7 @@ const PUBLIC_DSN = 'https://username@domain/123'; class MockIntegration implements Integration { public name: string; - public setupOnce = jest.fn(); + public setupOnce: jest.Mock = jest.fn(); public constructor(name: string) { this.name = name; } @@ -23,7 +24,7 @@ describe('init()', () => { }); afterEach(() => { - // @ts-ignore + // @ts-ignore - Reset the default integrations of node sdk to original sdk.defaultIntegrations = defaultIntegrationsBackup; }); @@ -33,7 +34,7 @@ describe('init()', () => { new MockIntegration('Mock integration 1.2'), ]; - //@ts-ignore + // @ts-ignore - Replace default integrations with mock integrations, needs ts-ignore because imports are readonly sdk.defaultIntegrations = mockDefaultIntegrations; init({ dsn: PUBLIC_DSN, defaultIntegrations: false }); @@ -48,7 +49,7 @@ describe('init()', () => { new MockIntegration('Some mock integration 2.2'), ]; - //@ts-ignore + // @ts-ignore - Replace default integrations with mock integrations, needs ts-ignore because imports are readonly sdk.defaultIntegrations = mockDefaultIntegrations; const mockIntegrations = [ @@ -70,7 +71,7 @@ describe('init()', () => { new MockIntegration('Some mock integration 3.2'), ]; - //@ts-ignore + // @ts-ignore - Replace default integrations with mock integrations, needs ts-ignore because imports are readonly sdk.defaultIntegrations = mockDefaultIntegrations; const newIntegration = new MockIntegration('Some mock integration 3.3'); From 0e142ab25b89f3e8f3902cc48316cb994156f56d Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 19 Apr 2022 12:40:06 +0000 Subject: [PATCH 28/33] Extract `getDefaultNodeClientOptions` into helper module --- packages/node/test/client.test.ts | 12 +----------- packages/node/test/handlers.test.ts | 13 ++----------- packages/node/test/helper/node-client-options.ts | 12 ++++++++++++ packages/node/test/index.test.ts | 13 ++----------- packages/node/test/integrations/http.test.ts | 13 ++----------- .../node/test/integrations/linkederrors.test.ts | 12 +----------- packages/node/test/transports/setup.test.ts | 11 +---------- 7 files changed, 21 insertions(+), 65 deletions(-) create mode 100644 packages/node/test/helper/node-client-options.ts diff --git a/packages/node/test/client.test.ts b/packages/node/test/client.test.ts index c56a302a9a00..bb3d13ca4122 100644 --- a/packages/node/test/client.test.ts +++ b/packages/node/test/client.test.ts @@ -1,21 +1,11 @@ import { Scope, SessionFlusher } from '@sentry/hub'; -import { NoopTransport } from '@sentry/core'; import { NodeClient } from '../src'; import { setupNodeTransport } from '../src/transports'; -import { NodeClientOptions } from '../src/types'; +import { getDefaultNodeClientOptions } from './helper/node-client-options'; const PUBLIC_DSN = 'https://username@domain/123'; -function getDefaultNodeClientOptions(options: Partial = {}): NodeClientOptions { - return { - integrations: [], - transport: NoopTransport, - stackParser: () => [], - ...options, - }; -} - describe('NodeClient', () => { let client: NodeClient; diff --git a/packages/node/test/handlers.test.ts b/packages/node/test/handlers.test.ts index 3830ab8c0376..b857e1b74bf5 100644 --- a/packages/node/test/handlers.test.ts +++ b/packages/node/test/handlers.test.ts @@ -1,6 +1,6 @@ import * as sentryCore from '@sentry/core'; -import { Hub } from '@sentry/hub'; import * as sentryHub from '@sentry/hub'; +import { Hub } from '@sentry/hub'; import { Transaction } from '@sentry/tracing'; import { Runtime } from '@sentry/types'; import { SentryError } from '@sentry/utils'; @@ -19,16 +19,7 @@ import { } from '../src/handlers'; import * as SDK from '../src/sdk'; import { setupNodeTransport } from '../src/transports'; -import { NodeClientOptions } from '../src/types'; - -function getDefaultNodeClientOptions(options: Partial = {}): NodeClientOptions { - return { - integrations: [], - transport: sentryCore.NoopTransport, - stackParser: () => [], - ...options, - }; -} +import { getDefaultNodeClientOptions } from './helper/node-client-options'; describe('parseRequest', () => { let mockReq: { [key: string]: any }; diff --git a/packages/node/test/helper/node-client-options.ts b/packages/node/test/helper/node-client-options.ts new file mode 100644 index 000000000000..c2bb1d42a871 --- /dev/null +++ b/packages/node/test/helper/node-client-options.ts @@ -0,0 +1,12 @@ +import { NoopTransport } from '@sentry/core'; + +import { NodeClientOptions } from '../../src/types'; + +export function getDefaultNodeClientOptions(options: Partial = {}): NodeClientOptions { + return { + integrations: [], + transport: NoopTransport, + stackParser: () => [], + ...options, + }; +} diff --git a/packages/node/test/index.test.ts b/packages/node/test/index.test.ts index cf090240f70f..2bdf8497097c 100644 --- a/packages/node/test/index.test.ts +++ b/packages/node/test/index.test.ts @@ -1,4 +1,4 @@ -import { initAndBind, SDK_VERSION, NoopTransport } from '@sentry/core'; +import { initAndBind, SDK_VERSION } from '@sentry/core'; import { getMainCarrier } from '@sentry/hub'; import { Integration } from '@sentry/types'; import { createStackParser } from '@sentry/utils'; @@ -19,7 +19,7 @@ import { import { ContextLines, LinkedErrors } from '../src/integrations'; import { nodeStackParser } from '../src/stack-parser'; import { setupNodeTransport } from '../src/transports'; -import { NodeClientOptions } from '../src/types'; +import { getDefaultNodeClientOptions } from './helper/node-client-options'; const stackParser = createStackParser(nodeStackParser); @@ -31,15 +31,6 @@ jest.mock('@sentry/core', () => { }; }); -function getDefaultNodeClientOptions(options: Partial = {}): NodeClientOptions { - return { - integrations: [], - transport: NoopTransport, - stackParser: () => [], - ...options, - }; -} - const dsn = 'https://53039209a22b4ec1bcc296a3c9fdecd6@sentry.io/4291'; // eslint-disable-next-line no-var diff --git a/packages/node/test/integrations/http.test.ts b/packages/node/test/integrations/http.test.ts index 4e0599bac161..30a923524a3e 100644 --- a/packages/node/test/integrations/http.test.ts +++ b/packages/node/test/integrations/http.test.ts @@ -1,6 +1,6 @@ import * as sentryCore from '@sentry/core'; -import { Hub } from '@sentry/hub'; import * as hubModule from '@sentry/hub'; +import { Hub } from '@sentry/hub'; import { addExtensionMethods, Span, TRACEPARENT_REGEXP, Transaction } from '@sentry/tracing'; import { parseSemver } from '@sentry/utils'; import * as http from 'http'; @@ -12,19 +12,10 @@ import { Breadcrumb } from '../../src'; import { NodeClient } from '../../src/client'; import { Http as HttpIntegration } from '../../src/integrations/http'; import { setupNodeTransport } from '../../src/transports'; -import { NodeClientOptions } from '../../src/types'; +import { getDefaultNodeClientOptions } from '../helper/node-client-options'; const NODE_VERSION = parseSemver(process.versions.node); -function getDefaultNodeClientOptions(options: Partial = {}): NodeClientOptions { - return { - integrations: [], - transport: sentryCore.NoopTransport, - stackParser: () => [], - ...options, - }; -} - describe('tracing', () => { function createTransactionOnScope() { const options = getDefaultNodeClientOptions({ diff --git a/packages/node/test/integrations/linkederrors.test.ts b/packages/node/test/integrations/linkederrors.test.ts index 1e8fb966a1e4..4d18707be904 100644 --- a/packages/node/test/integrations/linkederrors.test.ts +++ b/packages/node/test/integrations/linkederrors.test.ts @@ -1,26 +1,16 @@ import { ExtendedError } from '@sentry/types'; import { createStackParser } from '@sentry/utils'; -import { NoopTransport } from '@sentry/core'; import { Event, NodeClient } from '../../src'; import { LinkedErrors } from '../../src/integrations/linkederrors'; import { nodeStackParser } from '../../src/stack-parser'; import { setupNodeTransport } from '../../src/transports'; -import { NodeClientOptions } from '../../src/types'; +import { getDefaultNodeClientOptions } from '../helper/node-client-options'; const stackParser = createStackParser(nodeStackParser); let linkedErrors: any; -function getDefaultNodeClientOptions(options: Partial = {}): NodeClientOptions { - return { - integrations: [], - transport: NoopTransport, - stackParser: () => [], - ...options, - }; -} - describe('LinkedErrors', () => { beforeEach(() => { linkedErrors = new LinkedErrors(); diff --git a/packages/node/test/transports/setup.test.ts b/packages/node/test/transports/setup.test.ts index e24bb2a9cfc3..38f99a4c95f3 100644 --- a/packages/node/test/transports/setup.test.ts +++ b/packages/node/test/transports/setup.test.ts @@ -3,7 +3,7 @@ import { FakeTransport } from '@sentry/core/test/mocks/transport'; import { HTTPSTransport, HTTPTransport, setupNodeTransport } from '@sentry/node/src/transports'; import { makeNodeTransport } from '../../src/transports/new'; -import { NodeClientOptions } from '../../src/types'; +import { getDefaultNodeClientOptions } from '../helper/node-client-options'; jest.mock('../../src/transports/new', () => { const original = jest.requireActual('../../src/transports/new'); @@ -16,15 +16,6 @@ jest.mock('../../src/transports/new', () => { }; }); -function getDefaultNodeClientOptions(options: Partial = {}): NodeClientOptions { - return { - integrations: [], - transport: NoopTransport, - stackParser: () => [], - ...options, - }; -} - const DSN = 'https://username@domain/123'; describe('setupNodeTransport', () => { From bb8f9175e86a9a43c9a45015c26c6fbfc9c808a6 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 19 Apr 2022 15:00:24 +0200 Subject: [PATCH 29/33] fix remaning browser unit tests --- .../unit/helper/browser-client-options.ts | 11 ++ packages/browser/test/unit/index.test.ts | 111 ++++++++---------- .../unit/integrations/linkederrors.test.ts | 19 +-- packages/browser/test/unit/sdk.test.ts | 2 +- .../test/unit/transports/setup.test.ts | 19 +-- 5 files changed, 70 insertions(+), 92 deletions(-) create mode 100644 packages/browser/test/unit/helper/browser-client-options.ts diff --git a/packages/browser/test/unit/helper/browser-client-options.ts b/packages/browser/test/unit/helper/browser-client-options.ts new file mode 100644 index 000000000000..fc7971fa17f2 --- /dev/null +++ b/packages/browser/test/unit/helper/browser-client-options.ts @@ -0,0 +1,11 @@ +import { NoopTransport } from '@sentry/core'; +import { BrowserClientOptions } from '../../../src/client'; + +export function getDefaultBrowserClientOptions(options: Partial = {}): BrowserClientOptions { + return { + integrations: [], + transport: NoopTransport, + stackParser: () => [], + ...options, + }; +} diff --git a/packages/browser/test/unit/index.test.ts b/packages/browser/test/unit/index.test.ts index 9371e60073c1..434dea98977a 100644 --- a/packages/browser/test/unit/index.test.ts +++ b/packages/browser/test/unit/index.test.ts @@ -16,6 +16,7 @@ import { showReportDialog, wrap, } from '../../src'; +import { getDefaultBrowserClientOptions } from './helper/browser-client-options'; import { SimpleTransport } from './mocks/simpletransport'; const dsn = 'https://53039209a22b4ec1bcc296a3c9fdecd6@sentry.io/4291'; @@ -75,7 +76,8 @@ describe('SentryBrowser', () => { describe('showReportDialog', () => { describe('user', () => { const EX_USER = { email: 'test@example.com' }; - const client = new BrowserClient({ dsn }, new SimpleTransport({ dsn })); + const options = getDefaultBrowserClientOptions({ dsn }); + const client = new BrowserClient(options, new SimpleTransport({ dsn })); const reportDialogSpy = jest.spyOn(client, 'showReportDialog'); beforeEach(() => { @@ -139,53 +141,41 @@ describe('SentryBrowser', () => { }); it('should capture a message', done => { - getCurrentHub().bindClient( - new BrowserClient( - { - beforeSend: (event: Event): Event | null => { - expect(event.message).toBe('test'); - expect(event.exception).toBeUndefined(); - done(); - return event; - }, - dsn, - }, - new SimpleTransport({ dsn }), - ), - ); + const options = getDefaultBrowserClientOptions({ + beforeSend: (event: Event): Event | null => { + expect(event.message).toBe('test'); + expect(event.exception).toBeUndefined(); + done(); + return event; + }, + dsn, + }); + getCurrentHub().bindClient(new BrowserClient(options, new SimpleTransport({ dsn }))); captureMessage('test'); }); it('should capture an event', done => { - getCurrentHub().bindClient( - new BrowserClient( - { - beforeSend: (event: Event): Event | null => { - expect(event.message).toBe('event'); - expect(event.exception).toBeUndefined(); - done(); - return event; - }, - dsn, - }, - new SimpleTransport({ dsn }), - ), - ); + const options = getDefaultBrowserClientOptions({ + beforeSend: (event: Event): Event | null => { + expect(event.message).toBe('event'); + expect(event.exception).toBeUndefined(); + done(); + return event; + }, + dsn, + }); + getCurrentHub().bindClient(new BrowserClient(options, new SimpleTransport({ dsn }))); captureEvent({ message: 'event' }); }); it('should not dedupe an event on bound client', async () => { const localBeforeSend = jest.fn(); - getCurrentHub().bindClient( - new BrowserClient( - { - beforeSend: localBeforeSend, - dsn, - integrations: [], - }, - new SimpleTransport({ dsn }), - ), - ); + const options = getDefaultBrowserClientOptions({ + beforeSend: localBeforeSend, + dsn, + integrations: [], + }); + getCurrentHub().bindClient(new BrowserClient(options, new SimpleTransport({ dsn }))); captureMessage('event222'); captureMessage('event222'); @@ -197,16 +187,12 @@ describe('SentryBrowser', () => { it('should use inboundfilter rules of bound client', async () => { const localBeforeSend = jest.fn(); - getCurrentHub().bindClient( - new BrowserClient( - { - beforeSend: localBeforeSend, - dsn, - integrations: [new Integrations.InboundFilters({ ignoreErrors: ['capture'] })], - }, - new SimpleTransport({ dsn }), - ), - ); + const options = getDefaultBrowserClientOptions({ + beforeSend: localBeforeSend, + dsn, + integrations: [new Integrations.InboundFilters({ ignoreErrors: ['capture'] })], + }); + getCurrentHub().bindClient(new BrowserClient(options, new SimpleTransport({ dsn }))); captureMessage('capture'); @@ -267,7 +253,8 @@ describe('SentryBrowser initialization', () => { }); it('should set SDK data when instantiating a client directly', () => { - const client = new BrowserClient({ dsn }, new SimpleTransport({ dsn })); + const options = getDefaultBrowserClientOptions({ dsn }); + const client = new BrowserClient(options, new SimpleTransport({ dsn })); const sdkData = (client.getTransport() as any)._api.metadata?.sdk; @@ -309,20 +296,16 @@ describe('SentryBrowser initialization', () => { describe('wrap()', () => { it('should wrap and call function while capturing error', done => { - getCurrentHub().bindClient( - new BrowserClient( - { - beforeSend: (event: Event): Event | null => { - expect(event.exception!.values![0].type).toBe('TypeError'); - expect(event.exception!.values![0].value).toBe('mkey'); - done(); - return null; - }, - dsn, - }, - new SimpleTransport({ dsn }), - ), - ); + const options = getDefaultBrowserClientOptions({ + beforeSend: (event: Event): Event | null => { + expect(event.exception!.values![0].type).toBe('TypeError'); + expect(event.exception!.values![0].value).toBe('mkey'); + done(); + return null; + }, + dsn, + }); + getCurrentHub().bindClient(new BrowserClient(options, new SimpleTransport({ dsn }))); try { wrap(() => { diff --git a/packages/browser/test/unit/integrations/linkederrors.test.ts b/packages/browser/test/unit/integrations/linkederrors.test.ts index 393568164863..4b862705bccc 100644 --- a/packages/browser/test/unit/integrations/linkederrors.test.ts +++ b/packages/browser/test/unit/integrations/linkederrors.test.ts @@ -1,20 +1,11 @@ import { Event as SentryEvent, Exception, ExtendedError } from '@sentry/types'; import { createStackParser } from '@sentry/utils'; -import { BrowserClient, BrowserClientOptions } from '../../../src/client'; +import { BrowserClient } from '../../../src/client'; import * as LinkedErrorsModule from '../../../src/integrations/linkederrors'; import { defaultStackParsers } from '../../../src/stack-parsers'; import { setupBrowserTransport } from '../../../src/transports'; -import { NoopTransport } from '@sentry/core/src/transports/noop'; - -function getDefaultBrowserOptions(options: Partial = {}): BrowserClientOptions { - return { - integrations: [], - transport: NoopTransport, - stackParser: () => [], - ...options, - }; -} +import { getDefaultBrowserClientOptions } from '../helper/browser-client-options'; const parser = createStackParser(...defaultStackParsers); @@ -55,7 +46,7 @@ describe('LinkedErrors', () => { one.cause = two; const originalException = one; - const options = getDefaultBrowserOptions({ stackParser: parser }); + const options = getDefaultBrowserClientOptions({ stackParser: parser }); const client = new BrowserClient(options, setupBrowserTransport(options).transport); return client.eventFromException(originalException).then(event => { const result = LinkedErrorsModule._handler(parser, 'cause', 5, event, { @@ -86,7 +77,7 @@ describe('LinkedErrors', () => { one.reason = two; const originalException = one; - const options = getDefaultBrowserOptions({ stackParser: parser }); + const options = getDefaultBrowserClientOptions({ stackParser: parser }); const client = new BrowserClient(options, setupBrowserTransport(options).transport); return client.eventFromException(originalException).then(event => { const result = LinkedErrorsModule._handler(parser, 'reason', 5, event, { @@ -113,7 +104,7 @@ describe('LinkedErrors', () => { one.cause = two; two.cause = three; - const options = getDefaultBrowserOptions({ stackParser: parser }); + const options = getDefaultBrowserClientOptions({ stackParser: parser }); const client = new BrowserClient(options, setupBrowserTransport(options).transport); const originalException = one; return client.eventFromException(originalException).then(event => { diff --git a/packages/browser/test/unit/sdk.test.ts b/packages/browser/test/unit/sdk.test.ts index 55f6cae2131a..013430e3d012 100644 --- a/packages/browser/test/unit/sdk.test.ts +++ b/packages/browser/test/unit/sdk.test.ts @@ -1,10 +1,10 @@ import { NoopTransport, Scope } from '@sentry/core'; import { Client, Integration } from '@sentry/types'; -import { BrowserOptions } from '../../src/client'; import { MockIntegration } from '@sentry/core/test/lib/sdk.test'; import { init } from '../../src/sdk'; +import { BrowserOptions } from '../../src'; // eslint-disable-next-line no-var declare var global: any; diff --git a/packages/browser/test/unit/transports/setup.test.ts b/packages/browser/test/unit/transports/setup.test.ts index 3f9497a97933..41b361d684d5 100644 --- a/packages/browser/test/unit/transports/setup.test.ts +++ b/packages/browser/test/unit/transports/setup.test.ts @@ -7,17 +7,8 @@ import { setupBrowserTransport, XHRTransport, } from '../../../src/transports'; +import { getDefaultBrowserClientOptions } from '../helper/browser-client-options'; import { SimpleTransport } from '../mocks/simpletransport'; -import { BrowserClientOptions } from '../../../src/client'; - -function getDefaultBrowserOptions(options: Partial = {}): BrowserClientOptions { - return { - integrations: [], - transport: NoopTransport, - stackParser: () => [], - ...options, - }; -} const DSN = 'https://username@domain/123'; @@ -74,7 +65,7 @@ describe('setupBrowserTransport', () => { }); it('returns the instantiated transport passed via the options', () => { - const options = getDefaultBrowserOptions({ dsn: DSN, transport: SimpleTransport }); + const options = getDefaultBrowserClientOptions({ dsn: DSN, transport: SimpleTransport }); const { transport, newTransport } = setupBrowserTransport(options); expect(transport).toBeDefined(); @@ -83,7 +74,8 @@ describe('setupBrowserTransport', () => { }); it('returns fetchTransports if fetch is supported', () => { - const options = getDefaultBrowserOptions({ dsn: DSN }); + const options = getDefaultBrowserClientOptions({ dsn: DSN }); + delete options.transport; const { transport, newTransport } = setupBrowserTransport(options); expect(transport).toBeDefined(); @@ -96,7 +88,8 @@ describe('setupBrowserTransport', () => { it('returns xhrTransports if fetch is not supported', () => { fetchSupported = false; - const options = getDefaultBrowserOptions({ dsn: DSN }); + const options = getDefaultBrowserClientOptions({ dsn: DSN }); + delete options.transport; const { transport, newTransport } = setupBrowserTransport(options); expect(transport).toBeDefined(); From fed3fd07f0717ce7a3c870ab5f635a045c25e6c8 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 19 Apr 2022 15:12:35 +0200 Subject: [PATCH 30/33] fix tracing unit tests --- .../test/browser/backgroundtab.test.ts | 3 +- .../test/browser/browsertracing.test.ts | 7 +- packages/tracing/test/browser/request.test.ts | 3 +- packages/tracing/test/hub.test.ts | 79 ++++++++++--------- packages/tracing/test/idletransaction.test.ts | 5 +- packages/tracing/test/span.test.ts | 11 +-- 6 files changed, 57 insertions(+), 51 deletions(-) diff --git a/packages/tracing/test/browser/backgroundtab.test.ts b/packages/tracing/test/browser/backgroundtab.test.ts index 440eb785a609..29612b410322 100644 --- a/packages/tracing/test/browser/backgroundtab.test.ts +++ b/packages/tracing/test/browser/backgroundtab.test.ts @@ -1,5 +1,6 @@ import { BrowserClient } from '@sentry/browser'; import { setupBrowserTransport } from '@sentry/browser/src/transports'; +import { getDefaultBrowserClientOptions } from '@sentry/browser/test/unit/helper/browser-client-options'; import { Hub, makeMain } from '@sentry/hub'; import { JSDOM } from 'jsdom'; @@ -14,7 +15,7 @@ describe('registerBackgroundTabDetection', () => { // @ts-ignore need to override global document global.document = dom.window.document; - const options = { tracesSampleRate: 1 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 1 }); hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); diff --git a/packages/tracing/test/browser/browsertracing.test.ts b/packages/tracing/test/browser/browsertracing.test.ts index dfa4e0436b8c..76ccaf947271 100644 --- a/packages/tracing/test/browser/browsertracing.test.ts +++ b/packages/tracing/test/browser/browsertracing.test.ts @@ -1,5 +1,6 @@ import { BrowserClient } from '@sentry/browser'; import { setupBrowserTransport } from '@sentry/browser/src/transports'; +import { getDefaultBrowserClientOptions } from '@sentry/browser/test/unit/helper/browser-client-options'; import { Hub, makeMain } from '@sentry/hub'; import { getGlobalObject, InstrumentHandlerCallback, InstrumentHandlerType } from '@sentry/utils'; import { JSDOM } from 'jsdom'; @@ -52,7 +53,7 @@ describe('BrowserTracing', () => { let hub: Hub; beforeEach(() => { jest.useFakeTimers(); - const options = { tracesSampleRate: 1 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 1 }); hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); document.head.innerHTML = ''; @@ -474,7 +475,7 @@ describe('BrowserTracing', () => { getGlobalObject().location = dogParkLocation as any; const tracesSampler = jest.fn(); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); hub.bindClient(new BrowserClient(options, setupBrowserTransport(options).transport)); // setting up the BrowserTracing integration automatically starts a pageload transaction createBrowserTracing(true); @@ -491,7 +492,7 @@ describe('BrowserTracing', () => { getGlobalObject().location = dogParkLocation as any; const tracesSampler = jest.fn(); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); hub.bindClient(new BrowserClient(options, setupBrowserTransport(options).transport)); // setting up the BrowserTracing integration normally automatically starts a pageload transaction, but that's not // what we're testing here diff --git a/packages/tracing/test/browser/request.test.ts b/packages/tracing/test/browser/request.test.ts index 65823e293351..4ead6fe5bb9b 100644 --- a/packages/tracing/test/browser/request.test.ts +++ b/packages/tracing/test/browser/request.test.ts @@ -1,5 +1,6 @@ import { BrowserClient } from '@sentry/browser'; import { setupBrowserTransport } from '@sentry/browser/src/transports'; +import { getDefaultBrowserClientOptions } from '@sentry/browser/test/unit/helper/browser-client-options'; import { Hub, makeMain } from '@sentry/hub'; import * as utils from '@sentry/utils'; @@ -73,7 +74,7 @@ describe('callbacks', () => { }; beforeAll(() => { - const options = { tracesSampleRate: 1 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 1 }); hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); }); diff --git a/packages/tracing/test/hub.test.ts b/packages/tracing/test/hub.test.ts index 045d9fa96fb1..6df8bad175c1 100644 --- a/packages/tracing/test/hub.test.ts +++ b/packages/tracing/test/hub.test.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/unbound-method */ import { BrowserClient } from '@sentry/browser'; import { setupBrowserTransport } from '@sentry/browser/src/transports'; +import { getDefaultBrowserClientOptions } from '@sentry/browser/test/unit/helper/browser-client-options'; import { Hub, makeMain } from '@sentry/hub'; import * as utilsModule from '@sentry/utils'; // for mocking import { logger } from '@sentry/utils'; @@ -33,7 +34,7 @@ describe('Hub', () => { describe('getTransaction()', () => { it('should find a transaction which has been set on the scope if sampled = true', () => { - const options = { tracesSampleRate: 1 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 1 }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); const transaction = hub.startTransaction({ name: 'dogpark' }); @@ -47,7 +48,7 @@ describe('Hub', () => { }); it('should find a transaction which has been set on the scope if sampled = false', () => { - const options = { tracesSampleRate: 1 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 1 }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); const transaction = hub.startTransaction({ name: 'dogpark', sampled: false }); @@ -60,7 +61,7 @@ describe('Hub', () => { }); it("should not find an open transaction if it's not on the scope", () => { - const options = { tracesSampleRate: 1 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 1 }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); hub.startTransaction({ name: 'dogpark' }); @@ -73,7 +74,7 @@ describe('Hub', () => { describe('default sample context', () => { it('should add transaction context data to default sample context', () => { const tracesSampler = jest.fn(); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); @@ -90,7 +91,7 @@ describe('Hub', () => { it("should add parent's sampling decision to default sample context", () => { const tracesSampler = jest.fn(); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); const parentSamplingDecsion = false; @@ -109,7 +110,7 @@ describe('Hub', () => { describe('sample()', () => { it('should set sampled = false when tracing is disabled', () => { - const options = {}; + const options = getDefaultBrowserClientOptions({}); // neither tracesSampleRate nor tracesSampler is defined -> tracing disabled const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); @@ -119,7 +120,7 @@ describe('Hub', () => { }); it('should set sampled = false if tracesSampleRate is 0', () => { - const options = { tracesSampleRate: 0 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 0 }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); const transaction = hub.startTransaction({ name: 'dogpark' }); @@ -128,7 +129,7 @@ describe('Hub', () => { }); it('should set sampled = true if tracesSampleRate is 1', () => { - const options = { tracesSampleRate: 1 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 1 }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); const transaction = hub.startTransaction({ name: 'dogpark' }); @@ -137,7 +138,7 @@ describe('Hub', () => { }); it('should set sampled = true if tracesSampleRate is 1 (without global hub)', () => { - const options = { tracesSampleRate: 1 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 1 }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); const transaction = hub.startTransaction({ name: 'dogpark' }); @@ -146,7 +147,7 @@ describe('Hub', () => { it("should call tracesSampler if it's defined", () => { const tracesSampler = jest.fn(); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); hub.startTransaction({ name: 'dogpark' }); @@ -156,7 +157,7 @@ describe('Hub', () => { it('should set sampled = false if tracesSampler returns 0', () => { const tracesSampler = jest.fn().mockReturnValue(0); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); const transaction = hub.startTransaction({ name: 'dogpark' }); @@ -167,7 +168,7 @@ describe('Hub', () => { it('should set sampled = true if tracesSampler returns 1', () => { const tracesSampler = jest.fn().mockReturnValue(1); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); const transaction = hub.startTransaction({ name: 'dogpark' }); @@ -178,7 +179,7 @@ describe('Hub', () => { it('should set sampled = true if tracesSampler returns 1 (without global hub)', () => { const tracesSampler = jest.fn().mockReturnValue(1); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); const transaction = hub.startTransaction({ name: 'dogpark' }); @@ -189,7 +190,7 @@ describe('Hub', () => { it('should not try to override explicitly set positive sampling decision', () => { // so that the decision otherwise would be false const tracesSampler = jest.fn().mockReturnValue(0); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); const transaction = hub.startTransaction({ name: 'dogpark', sampled: true }); @@ -200,7 +201,7 @@ describe('Hub', () => { it('should not try to override explicitly set negative sampling decision', () => { // so that the decision otherwise would be true const tracesSampler = jest.fn().mockReturnValue(1); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); const transaction = hub.startTransaction({ name: 'dogpark', sampled: false }); @@ -211,7 +212,7 @@ describe('Hub', () => { it('should prefer tracesSampler to tracesSampleRate', () => { // make the two options do opposite things to prove precedence const tracesSampler = jest.fn().mockReturnValue(true); - const options = { tracesSampleRate: 0, tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 0, tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); const transaction = hub.startTransaction({ name: 'dogpark' }); @@ -222,7 +223,7 @@ describe('Hub', () => { it('should tolerate tracesSampler returning a boolean', () => { const tracesSampler = jest.fn().mockReturnValue(true); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); const transaction = hub.startTransaction({ name: 'dogpark' }); @@ -233,7 +234,7 @@ describe('Hub', () => { it('should record sampling method when sampling decision is explicitly set', () => { const tracesSampler = jest.fn().mockReturnValue(0.1121); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); hub.startTransaction({ name: 'dogpark', sampled: true }); @@ -245,7 +246,7 @@ describe('Hub', () => { it('should record sampling method and rate when sampling decision comes from tracesSampler', () => { const tracesSampler = jest.fn().mockReturnValue(0.1121); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); hub.startTransaction({ name: 'dogpark' }); @@ -256,7 +257,7 @@ describe('Hub', () => { }); it('should record sampling method when sampling decision is inherited', () => { - const options = { tracesSampleRate: 0.1121 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 0.1121 }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); hub.startTransaction({ name: 'dogpark', parentSampled: true }); @@ -267,7 +268,7 @@ describe('Hub', () => { }); it('should record sampling method and rate when sampling decision comes from traceSampleRate', () => { - const options = { tracesSampleRate: 0.1121 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 0.1121 }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); hub.startTransaction({ name: 'dogpark' }); @@ -280,7 +281,7 @@ describe('Hub', () => { describe('isValidSampleRate()', () => { it("should reject tracesSampleRates which aren't numbers or booleans", () => { - const options = { tracesSampleRate: 'dogs!' as any }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 'dogs!' as any }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); hub.startTransaction({ name: 'dogpark' }); @@ -289,7 +290,7 @@ describe('Hub', () => { }); it('should reject tracesSampleRates which are NaN', () => { - const options = { tracesSampleRate: 'dogs!' as any }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 'dogs!' as any }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); hub.startTransaction({ name: 'dogpark' }); @@ -299,7 +300,7 @@ describe('Hub', () => { // the rate might be a boolean, but for our purposes, false is equivalent to 0 and true is equivalent to 1 it('should reject tracesSampleRates less than 0', () => { - const options = { tracesSampleRate: -26 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: -26 }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); hub.startTransaction({ name: 'dogpark' }); @@ -309,7 +310,7 @@ describe('Hub', () => { // the rate might be a boolean, but for our purposes, false is equivalent to 0 and true is equivalent to 1 it('should reject tracesSampleRates greater than 1', () => { - const options = { tracesSampleRate: 26 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 26 }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); hub.startTransaction({ name: 'dogpark' }); @@ -319,7 +320,7 @@ describe('Hub', () => { it("should reject tracesSampler return values which aren't numbers or booleans", () => { const tracesSampler = jest.fn().mockReturnValue('dogs!'); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); hub.startTransaction({ name: 'dogpark' }); @@ -329,7 +330,7 @@ describe('Hub', () => { it('should reject tracesSampler return values which are NaN', () => { const tracesSampler = jest.fn().mockReturnValue(NaN); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); hub.startTransaction({ name: 'dogpark' }); @@ -340,7 +341,7 @@ describe('Hub', () => { // the rate might be a boolean, but for our purposes, false is equivalent to 0 and true is equivalent to 1 it('should reject tracesSampler return values less than 0', () => { const tracesSampler = jest.fn().mockReturnValue(-12); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); hub.startTransaction({ name: 'dogpark' }); @@ -351,7 +352,7 @@ describe('Hub', () => { // the rate might be a boolean, but for our purposes, false is equivalent to 0 and true is equivalent to 1 it('should reject tracesSampler return values greater than 1', () => { const tracesSampler = jest.fn().mockReturnValue(31); - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); hub.startTransaction({ name: 'dogpark' }); @@ -361,7 +362,7 @@ describe('Hub', () => { }); it('should drop transactions with sampled = false', () => { - const options = { tracesSampleRate: 0 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 0 }); const client = new BrowserClient(options, setupBrowserTransport(options).transport); jest.spyOn(client, 'captureEvent'); @@ -379,7 +380,7 @@ describe('Hub', () => { describe('sampling inheritance', () => { it('should propagate sampling decision to child spans', () => { - const options = { tracesSampleRate: Math.random() }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: Math.random() }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); const transaction = hub.startTransaction({ name: 'dogpark' }); @@ -392,11 +393,11 @@ describe('Hub', () => { testOnlyIfNodeVersionAtLeast(10)( 'should propagate positive sampling decision to child transactions in XHR header', async () => { - const options = { + const options = getDefaultBrowserClientOptions({ dsn: 'https://1231@dogs.are.great/1121', tracesSampleRate: 1, integrations: [new BrowserTracing()], - }; + }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); @@ -433,11 +434,11 @@ describe('Hub', () => { testOnlyIfNodeVersionAtLeast(10)( 'should propagate negative sampling decision to child transactions in XHR header', async () => { - const options = { + const options = getDefaultBrowserClientOptions({ dsn: 'https://1231@dogs.are.great/1121', tracesSampleRate: 1, integrations: [new BrowserTracing()], - }; + }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); @@ -483,7 +484,7 @@ describe('Hub', () => { // sample rate), so make parent's decision the opposite to prove that inheritance takes precedence over // tracesSampleRate mathRandom.mockReturnValueOnce(1); - const options = { tracesSampleRate: 0.5 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 0.5 }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); const parentSamplingDecsion = true; @@ -498,7 +499,7 @@ describe('Hub', () => { }); it("should inherit parent's negative sampling decision if tracesSampler is undefined", () => { - const options = { tracesSampleRate: 1 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 1 }); // tracesSampleRate = 1 means every transaction should end up with sampled = true, so make parent's decision the // opposite to prove that inheritance takes precedence over tracesSampleRate const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); @@ -520,7 +521,7 @@ describe('Hub', () => { const tracesSampler = () => true; const parentSamplingDecsion = false; - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); @@ -539,7 +540,7 @@ describe('Hub', () => { const tracesSampler = () => false; const parentSamplingDecsion = true; - const options = { tracesSampler }; + const options = getDefaultBrowserClientOptions({ tracesSampler }); const hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); makeMain(hub); diff --git a/packages/tracing/test/idletransaction.test.ts b/packages/tracing/test/idletransaction.test.ts index b8029c6b92d7..b040f4adbd9b 100644 --- a/packages/tracing/test/idletransaction.test.ts +++ b/packages/tracing/test/idletransaction.test.ts @@ -1,4 +1,5 @@ import { BrowserClient, Transports } from '@sentry/browser'; +import { getDefaultBrowserClientOptions } from '@sentry/browser/test/unit/helper/browser-client-options'; import { Hub } from '@sentry/hub'; import { @@ -16,8 +17,8 @@ class SimpleTransport extends Transports.BaseTransport {} const dsn = 'https://123@sentry.io/42'; let hub: Hub; beforeEach(() => { - const options = { dsn, tracesSampleRate: 1, transport: SimpleTransport }; - hub = new Hub(new BrowserClient(options, new SimpleTransport(options))); + const options = getDefaultBrowserClientOptions({ dsn, tracesSampleRate: 1, transport: SimpleTransport }); + hub = new Hub(new BrowserClient(options, new SimpleTransport({ dsn }))); }); describe('IdleTransaction', () => { diff --git a/packages/tracing/test/span.test.ts b/packages/tracing/test/span.test.ts index fe11fbf143ee..13f47c51ae7b 100644 --- a/packages/tracing/test/span.test.ts +++ b/packages/tracing/test/span.test.ts @@ -1,5 +1,6 @@ import { BrowserClient } from '@sentry/browser'; import { setupBrowserTransport } from '@sentry/browser/src/transports'; +import { getDefaultBrowserClientOptions } from '@sentry/browser/test/unit/helper/browser-client-options'; import { Hub, makeMain, Scope } from '@sentry/hub'; import { Span, Transaction } from '../src'; @@ -10,7 +11,7 @@ describe('Span', () => { beforeEach(() => { const myScope = new Scope(); - const options = { tracesSampleRate: 1 }; + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 1 }); hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport), myScope); makeMain(hub); }); @@ -218,10 +219,10 @@ describe('Span', () => { }); test('maxSpans correctly limits number of spans', () => { - const options = { + const options = getDefaultBrowserClientOptions({ _experiments: { maxSpans: 3 }, tracesSampleRate: 1, - }; + }); const _hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); const spy = jest.spyOn(_hub as any, 'captureEvent') as any; const transaction = _hub.startTransaction({ name: 'test' }); @@ -234,9 +235,9 @@ describe('Span', () => { }); test('no span recorder created if transaction.sampled is false', () => { - const options = { + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 1, - }; + }); const _hub = new Hub(new BrowserClient(options, setupBrowserTransport(options).transport)); const spy = jest.spyOn(_hub as any, 'captureEvent') as any; const transaction = _hub.startTransaction({ name: 'test', sampled: false }); From 88d4cff1b5ab99d6ee777b57884526b5672492f4 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 19 Apr 2022 15:35:28 +0200 Subject: [PATCH 31/33] fix linter errors --- packages/browser/test/unit/helper/browser-client-options.ts | 1 + packages/browser/test/unit/sdk.test.ts | 5 ++--- packages/core/test/lib/base.test.ts | 2 +- packages/core/test/lib/sdk.test.ts | 2 +- packages/tracing/test/errors.test.ts | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/browser/test/unit/helper/browser-client-options.ts b/packages/browser/test/unit/helper/browser-client-options.ts index fc7971fa17f2..aa763a5de06b 100644 --- a/packages/browser/test/unit/helper/browser-client-options.ts +++ b/packages/browser/test/unit/helper/browser-client-options.ts @@ -1,4 +1,5 @@ import { NoopTransport } from '@sentry/core'; + import { BrowserClientOptions } from '../../../src/client'; export function getDefaultBrowserClientOptions(options: Partial = {}): BrowserClientOptions { diff --git a/packages/browser/test/unit/sdk.test.ts b/packages/browser/test/unit/sdk.test.ts index 013430e3d012..55f3f66f2043 100644 --- a/packages/browser/test/unit/sdk.test.ts +++ b/packages/browser/test/unit/sdk.test.ts @@ -1,10 +1,9 @@ import { NoopTransport, Scope } from '@sentry/core'; -import { Client, Integration } from '@sentry/types'; - import { MockIntegration } from '@sentry/core/test/lib/sdk.test'; +import { Client, Integration } from '@sentry/types'; -import { init } from '../../src/sdk'; import { BrowserOptions } from '../../src'; +import { init } from '../../src/sdk'; // eslint-disable-next-line no-var declare var global: any; diff --git a/packages/core/test/lib/base.test.ts b/packages/core/test/lib/base.test.ts index 76c428aafd92..47ec8ae70266 100644 --- a/packages/core/test/lib/base.test.ts +++ b/packages/core/test/lib/base.test.ts @@ -4,7 +4,7 @@ import { dsnToString, logger, SentryError, SyncPromise } from '@sentry/utils'; import * as integrationModule from '../../src/integration'; import { NoopTransport } from '../../src/transports/noop'; -import { setupTestTransport, TestClient, getDefaultTestClientOptions } from '../mocks/client'; +import { getDefaultTestClientOptions, setupTestTransport, TestClient } from '../mocks/client'; import { TestIntegration } from '../mocks/integration'; import { FakeTransport } from '../mocks/transport'; diff --git a/packages/core/test/lib/sdk.test.ts b/packages/core/test/lib/sdk.test.ts index c58da346a310..7dd3229c5c7e 100644 --- a/packages/core/test/lib/sdk.test.ts +++ b/packages/core/test/lib/sdk.test.ts @@ -3,7 +3,7 @@ import { Client, Integration } from '@sentry/types'; import { installedIntegrations } from '../../src/integration'; import { initAndBind } from '../../src/sdk'; -import { setupTestTransport, TestClient, getDefaultTestClientOptions } from '../mocks/client'; +import { getDefaultTestClientOptions, setupTestTransport, TestClient } from '../mocks/client'; // eslint-disable-next-line no-var declare var global: any; diff --git a/packages/tracing/test/errors.test.ts b/packages/tracing/test/errors.test.ts index e1491bf7d28f..8dbcb2454539 100644 --- a/packages/tracing/test/errors.test.ts +++ b/packages/tracing/test/errors.test.ts @@ -1,11 +1,11 @@ import { BrowserClient } from '@sentry/browser'; import { setupBrowserTransport } from '@sentry/browser/src/transports'; +import { NoopTransport } from '@sentry/core/src/transports/noop'; import { Hub, makeMain } from '@sentry/hub'; import { InstrumentHandlerCallback, InstrumentHandlerType } from '@sentry/utils'; import { registerErrorInstrumentation } from '../src/errors'; import { _addTracingExtensions } from '../src/hubextensions'; -import { NoopTransport } from '@sentry/core/src/transports/noop'; const mockAddInstrumentationHandler = jest.fn(); let mockErrorCallback: InstrumentHandlerCallback = () => undefined; From ea99698b79704cebb6be67fb93333b9f70ba754b Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 19 Apr 2022 17:25:01 +0200 Subject: [PATCH 32/33] fix another set of linter errors --- packages/browser/test/unit/sdk.test.ts | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/browser/test/unit/sdk.test.ts b/packages/browser/test/unit/sdk.test.ts index 55f3f66f2043..48ee7d23d992 100644 --- a/packages/browser/test/unit/sdk.test.ts +++ b/packages/browser/test/unit/sdk.test.ts @@ -61,8 +61,8 @@ describe('init', () => { init(options); - expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(1); - expect((DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).mock.calls.length).toBe(1); + expect(DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).toHaveBeenCalledTimes(1); + expect(DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).toHaveBeenCalledTimes(1); }); test("doesn't install default integrations if told not to", () => { @@ -73,20 +73,17 @@ describe('init', () => { const options = getDefaultBrowserOptions({ dsn: PUBLIC_DSN, defaultIntegrations: false }); init(options); - expect((DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).mock.calls.length).toBe(0); - expect((DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).mock.calls.length).toBe(0); + expect(DEFAULT_INTEGRATIONS[0].setupOnce as jest.Mock).toHaveBeenCalledTimes(0); + expect(DEFAULT_INTEGRATIONS[1].setupOnce as jest.Mock).toHaveBeenCalledTimes(0); }); it('installs merged default integrations, with overrides provided through options', () => { - const DEFAULT_INTEGRATIONS: Integration[] = [ + const DEFAULT_INTEGRATIONS = [ new MockIntegration('MockIntegration 1.1'), new MockIntegration('MockIntegration 1.2'), ]; - const integrations: Integration[] = [ - new MockIntegration('MockIntegration 1.1'), - new MockIntegration('MockIntegration 1.3'), - ]; + const integrations = [new MockIntegration('MockIntegration 1.1'), new MockIntegration('MockIntegration 1.3')]; const options = getDefaultBrowserOptions({ dsn: PUBLIC_DSN, defaultIntegrations: DEFAULT_INTEGRATIONS, @@ -102,7 +99,7 @@ describe('init', () => { }); it('installs integrations returned from a callback function', () => { - const DEFAULT_INTEGRATIONS: Integration[] = [ + const DEFAULT_INTEGRATIONS = [ new MockIntegration('MockIntegration 2.1'), new MockIntegration('MockIntegration 2.2'), ]; From 3d098fff5736668e19d8e9d3becdb075a175484d Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Tue, 19 Apr 2022 11:51:10 -0400 Subject: [PATCH 33/33] fix lint in browser sdk unit test --- packages/browser/test/unit/sdk.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/browser/test/unit/sdk.test.ts b/packages/browser/test/unit/sdk.test.ts index 48ee7d23d992..8814329f16e9 100644 --- a/packages/browser/test/unit/sdk.test.ts +++ b/packages/browser/test/unit/sdk.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/unbound-method */ import { NoopTransport, Scope } from '@sentry/core'; import { MockIntegration } from '@sentry/core/test/lib/sdk.test'; import { Client, Integration } from '@sentry/types';