import { TestApp } from '@baserow/test/helpers/testApp'
import GridViewRows from '@baserow/modules/database/components/view/grid/GridViewRows'

describe('GridViewRows component', () => {
  let testApp = null
  let mockServer = null
  let store = null

  beforeAll(() => {
    testApp = new TestApp()
    store = testApp.store
    mockServer = testApp.mockServer
  })

  afterEach((done) => {
    testApp.afterEach().then(done)
  })

  const mountComponent = (props, slots = {}) => {
    return testApp.mount(GridViewRows, { propsData: props, slots })
  }

  const primary = {
    id: 1,
    name: 'Name',
    order: 0,
    type: 'text',
    primary: true,
    text_default: '',
    _: {
      loading: false,
    },
  }

  const fieldData = [
    {
      id: 2,
      name: 'Surname',
      type: 'text',
      text_default: '',
      primary: false,
      _: {
        loading: false,
      },
    },
    {
      id: 3,
      name: 'Address',
      type: 'text',
      text_default: '',
      primary: false,
      _: {
        loading: false,
      },
    },
  ]

  const rows = [
    { id: 2, order: '2.00000000000000000000', field_2: 'Bram' },
    { id: 4, order: '2.50000000000000000000', field_2: 'foo', field_3: 'bar' },
    { id: 3, order: '3.00000000000000000000', field_3: 'Jo' },
  ]

  const populateStore = async () => {
    const table = mockServer.createTable()
    const { application } = await mockServer.createAppAndGroup(table)
    const view = mockServer.createGridView(application, table, {})
    const fields = mockServer.createFields(application, table, fieldData)

    mockServer.createGridRows(view, fields, rows)
    await store.dispatch('page/view/grid/fetchInitial', {
      gridId: 1,
      fields,
      primary,
    })
    await store.dispatch('view/fetchAll', { id: 1 })
    return { table, fields, view }
  }

  test('Default component', async () => {
    const { fields, view } = await populateStore()

    const wrapper1 = await mountComponent({
      view,
      fields,
      allFields: fields,
      leftOffset: 0,
      readOnly: false,
      includeRowDetails: false,
      storePrefix: 'page/',
    })

    expect(wrapper1.element).toMatchSnapshot()
  })

  test('With row details', async () => {
    const { fields, view } = await populateStore()

    const wrapper1 = await mountComponent({
      view,
      fields,
      allFields: fields,
      leftOffset: 0,
      readOnly: false,
      includeRowDetails: true,
      storePrefix: 'page/',
    })

    expect(wrapper1.element).toMatchSnapshot()
  })
})