import { mount } from '@vue/test-utils';
import { Layout, Content, Header, Footer, Aside } from '..';
import { useNamespace } from '../../shared/hooks/use-namespace';

const ns = useNamespace('layout', true);
describe('Layout test', () => {
  it('header-content-footer layout', async () => {
    const wrapper = mount({
      components: {
        'd-layout': Layout,
        'd-header': Header,
        'd-content': Content,
        'd-footer': Footer,
      },
      template: `
      <d-layout>
        <d-header>Header</d-header>
        <d-content>Content</d-content>
        <d-footer>Footer</d-footer>
      </d-layout>
      `
    });
    const layout = wrapper.find(ns.b());
    expect(layout.exists()).toBeTruthy();
    const header = layout.find(ns.e('header'));
    expect(header.text()).toBe('Header');
    const content = header.element.nextElementSibling;
    expect(content?.innerHTML).toBe('Content');
    const footer = layout.find(ns.e('content')).element.nextElementSibling;
    expect(footer?.innerHTML).toBe('Footer');
  });

  it('header-aside-content-footer layout', async () => {
    const wrapper = mount({
      components: {
        'd-layout': Layout,
        'd-header': Header,
        'd-content': Content,
        'd-footer': Footer,
        'd-aside': Aside,
      },
      template: `
      <d-layout id="outerLayout">
        <d-header>Header</d-header>
        <d-layout id="innerLayout">
          <d-aside>Aside</d-aside>
          <d-content>Content</d-content>
        </d-layout>
        <d-footer>Footer</d-footer>
      </d-layout>
      `
    });
    const outerLayout = wrapper.find('#outerLayout');
    expect(outerLayout.exists()).toBeTruthy();
    const header = outerLayout.find(ns.e('header'));
    expect(header.text()).toBe('Header');
    const innerLayout = outerLayout.find('#innerLayout');
    const aside = innerLayout.find(ns.em('aside', 'inner'));
    const content = innerLayout.find(ns.e('content'));
    expect(content.text()).toBe('Content');
    expect(aside.text()).toBe('Aside');
    expect(outerLayout.find(ns.e('footer')).text()).toBe('Footer');
  });

  it('aside-header-content-footer layout', async () => {
    const wrapper = mount({
      components: {
        'd-layout': Layout,
        'd-header': Header,
        'd-content': Content,
        'd-footer': Footer,
        'd-aside': Aside,
      },
      template: `
      <d-layout id="outerLayout">
        <d-aside>Aside</d-aside>
        <d-layout id="innerLayout">
          <d-header>Header</d-header>
          <d-content>Content</d-content>
          <d-footer>Footer</d-footer>
        </d-layout>
      </d-layout>
      `
    });
    const outerLayout = wrapper.find('#outerLayout');
    expect(outerLayout.element.firstElementChild?.innerHTML).toBe('Aside');
    expect(outerLayout.element.children[1].getAttribute('id')).toBe('innerLayout');
    const innerLayout = outerLayout.find('#innerLayout');
    expect(innerLayout.element.children[0]?.innerHTML).toBe('Header');
    expect(innerLayout.element.children[1]?.innerHTML).toBe('Content');
    expect(innerLayout.element.children[2]?.innerHTML).toBe('Footer');
  });
});