const Airtable = require("airtable")
const AirtableIntegration = require("../airtable")
jest.mock("airtable")

class TestConfiguration {
  constructor(config = {}) {
    this.integration = new AirtableIntegration.integration(config) 
    this.client = {
      create: jest.fn(),
      select: jest.fn(),
      update: jest.fn(),
      destroy: jest.fn(),
    }
    this.integration.client = () => this.client 
  }
}

describe("Airtable Integration", () => {
  let config 

  beforeEach(() => {
    config = new TestConfiguration()
  })

  it("calls the create method with the correct params", async () => {
    const response = await config.integration.create({
      table: "test",
      json: {}
    })
    expect(config.client.create).toHaveBeenCalledWith([
      {
        fields: {}
      }
    ])
  })

  it("calls the read method with the correct params", async () => {
    const response = await config.integration.read({
      table: "test",
      view: "Grid view"
    })
    expect(config.client.select).toHaveBeenCalledWith({
      maxRecords: 10, view: "Grid view"
    })
  })

  it("calls the update method with the correct params", async () => {
    const response = await config.integration.update({
      table: "test",
      id: "123",
      json: {
        name: "test"
      }
    })
    expect(config.client.update).toHaveBeenCalledWith([
      {
        id: "123",
        fields: { name: "test" }
      }
    ])
  })

  it("calls the delete method with the correct params", async () => {
    const ids = [1,2,3,4]
    const response = await config.integration.delete({
      ids
    })
    expect(config.client.destroy).toHaveBeenCalledWith(ids)
  })
})