playwright-bdd
Version:
BDD Testing with Playwright runner
56 lines (46 loc) • 1.75 kB
text/typescript
/**
* Builds GherkinDocument message.
* Attaches extra fields (meta).
*/
import * as messages from '@cucumber/messages';
import { GherkinDocumentWithPickles } from '../../../gherkin/types';
import { ConcreteEnvelope } from './types';
import { omit } from '../../../utils';
import { ProjectInfo, getFeatureUriWithProject } from './Projects';
type GherkinDocumentMeta = {
originalUri: string;
projectName?: string;
browserName?: string;
};
type GherkinDocumentWithMeta = messages.GherkinDocument & {
[gherkinDocumentMetaSymbol]: GherkinDocumentMeta;
};
const gherkinDocumentMetaSymbol = Symbol('gherkinDocumentMeta');
export class GherkinDocumentMessage {
static extractMeta(gherkinDocument: messages.GherkinDocument) {
return (gherkinDocument as GherkinDocumentWithMeta)[gherkinDocumentMetaSymbol];
}
constructor(
private projectInfo: ProjectInfo,
private gherkinDocument: GherkinDocumentWithPickles,
) {}
build(): ConcreteEnvelope<'gherkinDocument'> {
const gherkinDocument = this.copyDocumentWithoutPickles();
this.setUriWithProject(gherkinDocument);
this.setMeta(gherkinDocument);
return { gherkinDocument };
}
private copyDocumentWithoutPickles() {
return omit(this.gherkinDocument, 'pickles');
}
private setUriWithProject(gherkinDocument: messages.GherkinDocument) {
gherkinDocument.uri = getFeatureUriWithProject(this.projectInfo, this.gherkinDocument.uri);
}
private setMeta(gherkinDocument: messages.GherkinDocument) {
(gherkinDocument as GherkinDocumentWithMeta)[gherkinDocumentMetaSymbol] = {
originalUri: this.gherkinDocument.uri || '',
projectName: this.projectInfo?.projectName,
browserName: this.projectInfo?.browserName,
};
}
}