import { DependencyType } from "@/dependencies/dependency-type";
import { RawQuiltMetadata } from "@/loaders/quilt/raw-quilt-metadata";
import { getQuiltDependencies, normalizeQuiltDependency } from "@/loaders/quilt/quilt-dependency";

describe("getQuiltDependencies", () => {
    test("returns an array of dependencies specified in the given metadata", () => {
        const metadata = {
            quilt_loader: {
                depends: [
                    {
                        id: "depends-id",
                        versions: "1.0.0",
                    },
                    {
                        id: "suggests-id",
                        versions: "3.0.0",
                        optional: true,
                    },
                ],
                breaks: [
                    {
                        id: "breaks-id",
                        versions: ["4.0.0", "5.0.0"],
                    },
                    {
                        id: "conflicts-id-1",
                        versions: "6.0.0",
                        unless: "fixes-conflicts-id-1",
                    },
                    {
                        id: "conflicts-id-2",
                        versions: "7.0.0",
                        unless: "fixes-conflicts-id-2",
                    },
                ],
            },
        } as RawQuiltMetadata;

        const dependencies = getQuiltDependencies(metadata);

        expect(dependencies).toEqual([
            { id: "depends-id", versions: "1.0.0" },
            { id: "suggests-id", versions: "3.0.0", optional: true },
            { id: "breaks-id", versions: ["4.0.0", "5.0.0"], breaking: true },
            { id: "conflicts-id-1", versions: "6.0.0", breaking: true, unless: "fixes-conflicts-id-1" },
            { id: "conflicts-id-2", versions: "7.0.0", breaking: true, unless: "fixes-conflicts-id-2" },
        ]);
    });

    test("returns an empty array if no dependencies were specified", () => {
        expect(getQuiltDependencies({} as RawQuiltMetadata)).toEqual([]);
    });

    test("returns an empty array if metadata was null or undefined", () => {
        expect(getQuiltDependencies(null)).toEqual([]);
        expect(getQuiltDependencies(undefined)).toEqual([]);
    });
});

describe("normalizeQuiltDependency", () => {
    test("converts Quilt dependency to a more abstract Dependency object", () => {
        const quiltDependency = { id: "suggested:suggests-id", versions: "2.0.0", optional: true };

        const dependency = normalizeQuiltDependency(quiltDependency);

        expect(dependency).toMatchObject({ id: "suggests-id", versions: ["2.0.0"], type: DependencyType.OPTIONAL });
    });

    test("returns undefined if dependency was null or undefined", () => {
        expect(normalizeQuiltDependency(null)).toBeUndefined();
        expect(normalizeQuiltDependency(undefined)).toBeUndefined();
    });
});