/**
 * @prettier
 */

describe("JSON Schema Form: Enum & Boolean in a Parameter", () => {
  beforeEach(() => {
    cy.visit("/?url=/documents/features/schema-form-enum-boolean.yaml")
      .get("#operations-pet-findPetsByStatus")
      .click()
      // Expand Try It Out
      .get(".try-out__btn")
      .click()
    // @alias Execute Button
    cy.get(".execute.opblock-control__btn").as("executeBtn")
    // @alias Parameters
    cy.get(".opblock-section tbody > tr > .parameters-col_description > select")
      .eq(0)
      .as("enumIsRequired")
    cy.get(".opblock-section tbody > tr > .parameters-col_description > select")
      .eq(1)
      .as("booleanIsOptional")
    cy.get(".opblock-section tbody > tr > .parameters-col_description > select")
      .eq(2)
      .as("booleanIsRequired")
  })

  it("should render @enumIsRequired with list of three options", () => {
    cy.get("@enumIsRequired")
      .should("contains.text", "available")
      .should("contains.text", "pending")
      .should("contains.text", "sold")
      .should("not.contains.text", "--")
      .find("option")
      .should("have.length", 3)
  })
  it("should render @booleanIsOptional with default empty string value (display '--')", () => {
    cy.get("@booleanIsOptional")
      .should("have.value", "")
      .should("contains.text", "--")
  })
  it("should render @booleanIsRequired with default empty string value (display '--')", () => {
    cy.get("@booleanIsRequired")
      .should("have.value", "")
      .should("contains.text", "--")
  })
  it("should NOT be able to execute with empty @enumIsRequired and @booleanIsRequired values", () => {
    // Execute
    cy.get("@executeBtn").click()
    cy.get("@enumIsRequired").should("have.class", "invalid")
    cy.get("@booleanIsRequired").should("have.class", "invalid")
    // cURL component
    cy.get(".responses-wrapper .curl-command").should("not.exist")
  })
  it("should NOT be able to execute with empty @booleanIsRequired value, but valid @enumIsRequired", () => {
    cy.get("@enumIsRequired").select("pending")
    // Execute
    cy.get("@executeBtn").click()
    cy.get("@enumIsRequired").should("not.have.class", "invalid")
    cy.get("@booleanIsRequired").should("have.class", "invalid")
    // cURL component
    cy.get(".responses-wrapper .curl-command").should("not.exist")
  })
  it("should NOT be able to execute with empty @enumIsRequired value, but valid @booleanIsRequired", () => {
    cy.get("@booleanIsRequired").select("false")
    // Execute
    cy.get("@executeBtn").click()
    cy.get("@enumIsRequired").should("have.class", "invalid")
    cy.get("@booleanIsRequired").should("not.have.class", "invalid")
    // cURL component
    cy.get(".responses-wrapper .curl-command").should("not.exist")
  })
  it("should execute, if @booleanIsOptional value is 'false'", () => {
    cy.get("@enumIsRequired").select("pending")
    cy.get("@booleanIsRequired").select("false")
    cy.get("@booleanIsOptional").select("false")
    // Execute
    cy.get("@executeBtn").click()
    cy.get("@enumIsRequired").should("not.have.class", "invalid")
    cy.get("@booleanIsRequired")
      .should("not.have.class", "invalid")
      .should("not.contains.text", "expectIsOptional")
    // cURL component
    cy.get(".responses-wrapper .curl-command") // hangs browser here
      .should("exist")
      .get(".responses-wrapper .curl-command span")
      .should("contains.text", "expectIsOptional=false")
  })
  it("should execute, but NOT send @booleanIsOptional value if not provided", () => {
    cy.get("@enumIsRequired").select("pending")
    cy.get("@booleanIsRequired").select("false")
    // Execute
    cy.get("@executeBtn").click()
    cy.get("@enumIsRequired").should("not.have.class", "invalid")
    cy.get("@booleanIsRequired")
      .should("not.have.class", "invalid")
      .should("not.contains.text", "expectIsOptional")
    // cURL component
    cy.get(".responses-wrapper .curl-command") // hangs browser here
      .should("exist")
      .get(".responses-wrapper .curl-command span")
      .should("not.contains.text", "expectIsOptional")
  })
})
