import "reflect-metadata"
import {
    closeTestingConnections,
    createTestingConnections,
    reloadTestingDatabases,
} from "../../utils/test-utils"
import { DataSource } from "../../../src/data-source/DataSource"
import { expect } from "chai"
import { Foo } from "./entities/Foo"
import { FooView } from "./entities/FooView"

const customTypeormMetadataTableName = "custom_typeorm_metadata_table_name"

describe("github issues > #7266 rename table typeorm_metadata name.", () => {
    let connections: DataSource[]

    before(
        async () =>
            (connections = await createTestingConnections({
                entities: [Foo, FooView],
                enabledDrivers: ["postgres", "mysql", "mariadb"],
                metadataTableName: customTypeormMetadataTableName,
            })),
    )
    beforeEach(() => reloadTestingDatabases(connections))
    after(() => closeTestingConnections(connections))

    it("should create the typeorm metadata table with a custom name when provided", () =>
        Promise.all(
            connections.map(async (connection) => {
                const queryRunner = connection.createQueryRunner()

                expect(connection.metadataTableName).to.equal(
                    customTypeormMetadataTableName,
                )

                const hasCustomMetadataTableName = await queryRunner.hasTable(
                    customTypeormMetadataTableName,
                )

                expect(hasCustomMetadataTableName).to.be.true

                const hasDefaultMetadataTableName = await queryRunner.hasTable(
                    "typeorm_metadata",
                )

                expect(hasDefaultMetadataTableName).to.be.false

                await queryRunner.release()
            }),
        ))

    it("should have correct views using the custom named metadata table", () =>
        Promise.all(
            connections.map(async (connection) => {
                const queryRunner = connection.createQueryRunner()

                const fooView = await queryRunner.getView("foo_view")

                expect(fooView).to.be.exist

                await queryRunner.release()
            }),
        ))
})
