import "reflect-metadata"
import {
    createTestingConnections,
    closeTestingConnections,
    reloadTestingDatabases,
} from "../../utils/test-utils"
import { DataSource } from "../../../src/data-source/DataSource"
import { expect } from "chai"
import { Customer } from "./entity/Customer"
import { CustomerContact } from "./entity/CustomerContact"

describe("github issues > #8346 MySQL: Regression when using take, orderBy, and getMany on a joined relation", () => {
    let connections: DataSource[]
    before(
        async () =>
            (connections = await createTestingConnections({
                entities: [__dirname + "/entity/*{.js,.ts}"],
                schemaCreate: true,
                dropSchema: true,
            })),
    )
    beforeEach(() => reloadTestingDatabases(connections))
    after(() => closeTestingConnections(connections))

    it("should return customers ordered by contacts", () =>
        Promise.all(
            connections.map(async (connection) => {
                const [user1, user2] = await connection
                    .getRepository(Customer)
                    .save([{ name: "userA" }, { name: "userB" }])
                await connection.getRepository(CustomerContact).save([
                    {
                        firstName: "firstName1",
                        lastName: "lastName1",
                        customer: user1,
                    },
                    {
                        firstName: "firstName2",
                        lastName: "lastName2",
                        customer: user2,
                    },
                ])

                const customerRepository = connection.getRepository(Customer)

                const results = await customerRepository
                    .createQueryBuilder("customer")
                    .leftJoinAndSelect("customer.contacts", "contacts")
                    .take(10)
                    .orderBy("contacts.firstName", "DESC")
                    .getMany()

                expect(results[0].id).to.equal(user2.id)
                expect(results[1].id).to.equal(user1.id)
            }),
        ))
})
