const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
const setup = require("./utilities")
const fs = require("fs")
const { resolve, join } = require("path")
const { budibaseAppsDir } = require("../../../utilities/budibaseDir")

describe("/component", () => {
  let request = setup.getRequest()
  let config = setup.getConfig()

  afterAll(setup.afterAll)

  beforeEach(async () => {
    await config.init()
  })

  function mock() {
    const manifestFile = "manifest.json"
    const appId = config.getAppId()
    const libraries = [join("@budibase", "standard-components")]
    for (let library of libraries) {
      let appDirectory = resolve(budibaseAppsDir(), appId, "node_modules", library, "package")
      fs.mkdirSync(appDirectory, { recursive: true })

      const file = require.resolve(library).split(join("dist", "index.js"))[0] + manifestFile
      fs.copyFileSync(file, join(appDirectory, manifestFile))
    }
  }

  describe("fetch definitions", () => {
    it("should be able to fetch definitions", async () => {
      // have to "mock" the files required
      mock()
      const res = await request
        .get(`/${config.getAppId()}/components/definitions`)
        .set(config.defaultHeaders())
        .expect("Content-Type", /json/)
        .expect(200)
      expect(res.body["@budibase/standard-components/container"]).toBeDefined()
    })

    it("should apply authorization to endpoint", async () => {
      await checkBuilderEndpoint({
        config,
        method: "GET",
        url: `/${config.getAppId()}/components/definitions`,
      })
    })
  })
})