Notification = require '../src/notification'

describe "Notification", ->
  [notification] = []

  it "throws an error when created with a non-string message", ->
    expect(-> new Notification('error', null)).toThrow()
    expect(-> new Notification('error', 3)).toThrow()
    expect(-> new Notification('error', {})).toThrow()
    expect(-> new Notification('error', false)).toThrow()
    expect(-> new Notification('error', [])).toThrow()

  it "throws an error when created with non-object options", ->
    expect(-> new Notification('error', 'message', 'foo')).toThrow()
    expect(-> new Notification('error', 'message', 3)).toThrow()
    expect(-> new Notification('error', 'message', false)).toThrow()
    expect(-> new Notification('error', 'message', [])).toThrow()

  describe "::getTimestamp()", ->
    it "returns a Date object", ->
      notification = new Notification('error', 'message!')
      expect(notification.getTimestamp() instanceof Date).toBe true

  describe "::getIcon()", ->
    it "returns a default when no icon specified", ->
      notification = new Notification('error', 'message!')
      expect(notification.getIcon()).toBe 'flame'

    it "returns the icon specified", ->
      notification = new Notification('error', 'message!', icon: 'my-icon')
      expect(notification.getIcon()).toBe 'my-icon'

  describe "dismissing notifications", ->
    describe "when the notfication is dismissable", ->
      it "calls a callback when the notification is dismissed", ->
        dismissedSpy = jasmine.createSpy()
        notification = new Notification('error', 'message', dismissable: true)
        notification.onDidDismiss dismissedSpy

        expect(notification.isDismissable()).toBe true
        expect(notification.isDismissed()).toBe false

        notification.dismiss()

        expect(dismissedSpy).toHaveBeenCalled()
        expect(notification.isDismissed()).toBe true

    describe "when the notfication is not dismissable", ->
      it "does nothing when ::dismiss() is called", ->
        dismissedSpy = jasmine.createSpy()
        notification = new Notification('error', 'message')
        notification.onDidDismiss dismissedSpy

        expect(notification.isDismissable()).toBe false
        expect(notification.isDismissed()).toBe true

        notification.dismiss()

        expect(dismissedSpy).not.toHaveBeenCalled()
        expect(notification.isDismissed()).toBe true
