import { asyncExpect } from '@/tests/utils'
import notification from '..'

describe('notification', () => {
  beforeEach(() => {
    document.body.outerHTML = ''
  })

  afterEach(() => {
    notification.destroy()
  })

  it('should be able to hide manually', async () => {
    notification.open({
      message: 'Notification Title',
      duration: 0,
      key: '1',
    })
    await asyncExpect(() => {
      notification.open({
        message: 'Notification Title',
        duration: 0,
        key: '2',
      })
    })
    await asyncExpect(() => {
      expect(document.querySelectorAll('.ant-notification-notice').length).toBe(2)
      notification.close('1')
    }, 0)
    await asyncExpect(() => {
      expect(document.querySelectorAll('.ant-notification-notice').length).toBe(1)
      notification.close('2')
    }, 0)
    await asyncExpect(() => {
      expect(document.querySelectorAll('.ant-notification-notice').length).toBe(0)
    }, 0)
  })

  it('should be able to destroy globally', async () => {
    notification.open({
      message: 'Notification Title',
      duration: 0,
    })
    await asyncExpect(() => {
      notification.open({
        message: 'Notification Title',
        duration: 0,
      })
    })
    await asyncExpect(() => {
      expect(document.querySelectorAll('.ant-notification').length).toBe(1)
      expect(document.querySelectorAll('.ant-notification-notice').length).toBe(2)
      notification.destroy()
    }, 0)
    await asyncExpect(() => {
      expect(document.querySelectorAll('.ant-notification').length).toBe(0)
      expect(document.querySelectorAll('.ant-notification-notice').length).toBe(0)
    }, 0)
  })

  it('should be able to destroy after config', () => {
    notification.config({
      bottom: 100,
    })
    notification.destroy()
  })

  it('should be able to open with icon', (done) => {
    const openNotificationWithIcon = async (type) => {
      const iconPrefix = '.ant-notification-notice-icon'
      notification[type]({
        message: 'Notification Title',
        duration: 0,
        description: 'This is the content of the notification.',
      })
      await asyncExpect(() => {
        expect(document.querySelectorAll(`${iconPrefix}-${type}`).length).toBe(1)
      }, 0)
    };
    ['success', 'info', 'warning', 'error'].forEach((type) => {
      openNotificationWithIcon(type)
    })
    done()
  })
})