# test.deploy/core/converters/nginx.converter.test.ts

> 44 lines of code and 0 definitions.

Tree: Codebase Testing
Language: typescript
Canonical: https://banes-lab.com/anatomy/testing#file-testing-test-deploy-core-converters-nginx-converter-test-ts
Source text: https://banes-lab.com/source/testing/test.deploy/core/converters/nginx.converter.test.ts.txt

Listed in [test.deploy/core/converters](https://banes-lab.com/api/source/testing/test.deploy/core/converters.md), after [test.deploy/core/converters/markdown.converter.test.ts](https://banes-lab.com/source/testing/test.deploy/core/converters/markdown.converter.test.ts.md) and before [test.deploy/core/converters/search.converter.test.ts](https://banes-lab.com/source/testing/test.deploy/core/converters/search.converter.test.ts.md).

## Contained in

- [test.deploy/core/converters](https://banes-lab.com/anatomy/testing/folder-testing-test-deploy-core-converters.md)

## Source

```typescript
import { describe, expect, it } from "vitest";
import { errorLogOf, scriptNameOf, scriptTextOf } from "@banes-lab/deploy/core/converters/nginx.converter.ts";
import { ERROR_LOG_MISSING } from "@banes-lab/deploy/configuration/strings/deployment.strings.ts";
import { absolutePath } from "@ssot/paths";
import { join } from "node:path";
import { readFileSync } from "node:fs";

describe("scriptNameOf and scriptTextOf", () => {
    it("ships a TypeScript njs script as JavaScript named for its subject, with its types stripped", () => {
        expect(scriptNameOf("catalog.entrypoint.ts")).toBe("catalog.js");
        const text = scriptTextOf(
            "query.ts",
            "interface A { readonly b: number }\nexport const c = (d: A): number => d.b;\n",
        );
        expect(text).not.toContain("interface");
        expect(text).toContain("export const c = (d) => d.b;");
    });

    it("imports a built-in by the bare name njs registers, because njs has no node: protocol", () => {
        const text = scriptTextOf("query.ts", 'import fs from "node:fs";\nexport const e = fs;\n');
        expect(text).toContain('import fs from "fs";');
        expect(text).not.toContain("node:");
    });

    it("leaves no node: specifier in the shipped query script", () => {
        const name = "catalog.entrypoint.ts";
        const source = readFileSync(join(absolutePath("app.nginxScripts"), name), "utf8");
        expect(scriptTextOf(name, source)).not.toContain('"node:');
    });

    it("passes a file that is not TypeScript through unchanged", () => {
        expect(scriptNameOf("rules.conf")).toBe("rules.conf");
        expect(scriptTextOf("rules.conf", "a b;\n")).toBe("a b;\n");
    });
});

describe("errorLogOf", () => {
    it("reads the error log path from the first error_log directive, with or without a level", () => {
        expect(errorLogOf("server {\n    error_log /var/log/a.log warn;\n}\n")).toBe("/var/log/a.log");
        expect(errorLogOf("    error_log /var/log/b.log;\n")).toBe("/var/log/b.log");
    });

    it("finds the error log the site file declares", () => {
        const site = readFileSync(absolutePath("app.nginxSite"), "utf8");
        expect(errorLogOf(site).length).toBeGreaterThan(0);
    });

    it("refuses a site file that declares no error log", () => {
        expect(() => errorLogOf("server {\n    access_log off;\n}\n")).toThrow(ERROR_LOG_MISSING);
    });
});
```
