@zerosuxx/opentelemetry-nestjs
Version:
OpenTelemetry module for Nestjs with auto instrumentation and resource detection. Initially forked from https://github.com/overbit/opentelemetry-nestjs.git
152 lines (132 loc) • 3.98 kB
text/typescript
import { Test } from '@nestjs/testing';
import { OpenTelemetryModule } from '../../OpenTelemetryModule';
import { NoopSpanProcessor } from '@opentelemetry/sdk-trace-node';
import { Injectable } from '@nestjs/common';
import { Constants } from '../../Constants';
import { Resolver, Query, Subscription, Mutation } from '@nestjs/graphql';
import { Tracing } from '../../Tracing';
describe('Tracing Decorator Injector Test', () => {
const sdkModule = OpenTelemetryModule.forRoot();
let exporterSpy: jest.SpyInstance;
const exporter = new NoopSpanProcessor();
Tracing.init({ serviceName: 'a', spanProcessors: [exporter] });
beforeEach(() => {
exporterSpy = jest.spyOn(exporter, 'onStart');
});
afterEach(() => {
exporterSpy.mockClear();
exporterSpy.mockReset();
});
it(`should trace graphql resolver provider Query method`, async () => {
// given
(() => {
/***/
})
class HelloService {
(() => [String], {
nullable: false,
})
// eslint-disable-next-line @typescript-eslint/no-empty-function
hi() {}
}
const context = await Test.createTestingModule({
imports: [sdkModule],
providers: [HelloService],
}).compile();
const app = context.createNestApplication();
const helloService = app.get(HelloService);
// when
helloService.hi();
//then
expect(exporterSpy).toHaveBeenCalledWith(
expect.objectContaining({ name: 'Resolver->HelloService.hi' }),
expect.any(Object),
);
await app.close();
});
it(`should trace graphql resolver provider Mutation method`, async () => {
// given
(() => {
/***/
})
class HelloService {
(() => [String], {
nullable: false,
})
// eslint-disable-next-line @typescript-eslint/no-empty-function
hi() {}
}
const context = await Test.createTestingModule({
imports: [sdkModule],
providers: [HelloService],
}).compile();
const app = context.createNestApplication();
const helloService = app.get(HelloService);
// when
helloService.hi();
//then
expect(exporterSpy).toHaveBeenCalledWith(
expect.objectContaining({ name: 'Resolver->HelloService.hi' }),
expect.any(Object),
);
await app.close();
});
it(`should trace graphql resolver provider Subscription method`, async () => {
// given
(() => {
/***/
})
class HelloService {
(() => [String], {
nullable: false,
})
// eslint-disable-next-line @typescript-eslint/no-empty-function
hi() {}
}
const context = await Test.createTestingModule({
imports: [sdkModule],
providers: [HelloService],
}).compile();
const app = context.createNestApplication();
const helloService = app.get(HelloService);
// when
helloService.hi();
//then
expect(exporterSpy).toHaveBeenCalledWith(
expect.objectContaining({ name: 'Resolver->HelloService.hi' }),
expect.any(Object),
);
await app.close();
});
it(`should not trace already tracing prototype`, async () => {
// given
()
()
class HelloService {
(() => [String], {
nullable: false,
})
// eslint-disable-next-line @typescript-eslint/no-empty-function
hi() {}
}
Reflect.defineMetadata(
Constants.TRACE_METADATA_ACTIVE,
1,
HelloService.prototype.hi,
);
const context = await Test.createTestingModule({
imports: [sdkModule],
providers: [HelloService],
}).compile();
const app = context.createNestApplication();
const helloService = app.get(HelloService);
// when
helloService.hi();
//then
expect(exporterSpy).not.toHaveBeenCalledWith(
expect.objectContaining({ name: 'Provider->HelloService.hi' }),
expect.any(Object),
);
await app.close();
});
});