import BaseEventHandler from '../index'
import { EventCallbackOptions } from '../index'
import { createLogger } from '../../../utils/logger'
import SdkSettings from '../../../settings'
import { EcRenderConfig } from '../../../enhancedContent'
import { makeContext, makeSettings } from '../../../__tests__/helpers'

const logger = createLogger(makeContext(), makeSettings())

describe('BaseEventHandler', () => {
  describe('#event_name', () => {
    test('implementing class overwrites base event name', () => {
      class EventNameClass extends BaseEventHandler {
        public eventName = 'test_event'
      }
      const _subject = new EventNameClass(logger)

      expect(_subject.eventName).toBe('test_event')
    })
  })

  describe('#handle', () => {
    let loggerSpy: jest.SpyInstance<
      void,
      [string, (Record<string, unknown> | SdkSettings | EcRenderConfig | undefined)?]
    >

    beforeEach(() => {
      loggerSpy = jest.spyOn(logger, 'log').mockImplementation()
    })

    afterEach(() => {
      loggerSpy.mockClear()
    })

    const options = { productIdType: 'test', productId: 'test' }

    test('implementing class overwrites handle method', () => {
      const testStub = jest.fn()

      class HandleMethodClass extends BaseEventHandler {
        public eventName = 'test_event'
        public handle(options: EventCallbackOptions): void {
          // some side effect goes here
          testStub(options)
        }
      }
      const _subject = new HandleMethodClass(logger)

      _subject.handle(options)

      expect(testStub).toHaveBeenCalledTimes(1)
    })

    test('implementing class has default handle method when not overridden', () => {
      class DefaultHandleClass extends BaseEventHandler {
        public eventName = 'test_method'
      }

      const _subject = new DefaultHandleClass(logger)

      _subject.handle(options)

      expect(loggerSpy).toHaveBeenCalledTimes(1)
    })
  })
})
