Skip to content

Testing

Import test doubles from the dedicated entrypoint:

typescript
import { configureMetrics, measure } from '@haskou/metrics';
import {
  InMemoryLoggerAdapter,
  InMemoryMetricsAdapter,
  ManualClock,
  ManualResourceUsageAdapter,
} from '@haskou/metrics/testing';

const adapter = new InMemoryMetricsAdapter();
const clock = new ManualClock();
const logger = new InMemoryLoggerAdapter();
const resources = new ManualResourceUsageAdapter();
const restore = configureMetrics({
  adapter,
  clock,
  logger,
  resourceUsage: resources,
});

measure('users.create', () => {
  clock.advance(8);
  return user;
});

expect(adapter.increments).toContainEqual(
  expect.objectContaining({
    name: 'users.create.calls',
    value: 1,
    attributes: {},
  }),
);
expect(adapter.observations[0]?.value).toBe(8);

restore();

InMemoryMetricsAdapter records counters and observations. InMemoryLoggerAdapter records serialized log entries. ManualClock controls elapsed time, while ManualResourceUsageAdapter controls CPU and memory snapshots. No-op metrics, logger, and resource adapters are also available from this testing entrypoint.

Included doubles

DoubleControl and observations
InMemoryMetricsAdapterincrements, observations, and clear()
InMemoryLoggerAdapterentries and clear()
ManualClockInitial milliseconds, advance(), and set()
ManualResourceUsageAdapterInitial resource values and set()
NoopMetricsAdapterDiscards metric measurements
NoopLoggerAdapterDiscards structured logs
NoopResourceUsageAdapterReturns an empty resource snapshot

RecordedIncrement and RecordedObservation are aliases of MetricMeasurementPrimitives, so tests can assert kind, unit, operation, name, value, and attributes without using a vendor SDK.