_ = require 'underscore'
proxyquire = require 'proxyquire'
Reflux = require 'reflux'
{Actions} = require 'nylas-exports'

stubUpdaterState = null
stubUpdaterReleaseVersion = null
ipcSendArgs = null

PackageMain = proxyquire "../lib/main",
  "ipc":
    send: ->
      ipcSendArgs = arguments
  "remote":
    getGlobal: (global) ->
      autoUpdateManager:
        releaseVersion: stubUpdaterReleaseVersion
        getState: -> stubUpdaterState

describe "NotificationUpdateAvailable", ->
  beforeEach ->
    stubUpdaterState = 'idle'
    stubUpdaterReleaseVersion = undefined
    ipcSendArgs = null
    @package = PackageMain

  afterEach ->
    @package.deactivate()

  describe "activate", ->
    it "should display a notification immediately if one is available", ->
      spyOn(@package, 'displayNotification')
      stubUpdaterState = 'update-available'
      @package.activate()
      expect(@package.displayNotification).toHaveBeenCalled()
    
    it "should not display a notification if no update is avialable", ->
      spyOn(@package, 'displayNotification')
      stubUpdaterState = 'no-update-available'
      @package.activate()
      expect(@package.displayNotification).not.toHaveBeenCalled()

    it "should listen for `window:update-available`", ->
      spyOn(atom, 'onUpdateAvailable').andCallThrough()
      @package.activate()
      expect(atom.onUpdateAvailable).toHaveBeenCalled()

  describe "displayNotification", ->
    beforeEach ->
      @package.activate()

    it "should fire a postNotification Action", ->
      spyOn(Actions, 'postNotification')
      @package.displayNotification()
      expect(Actions.postNotification).toHaveBeenCalled()

    it "should include the version if one is provided", ->
      spyOn(Actions, 'postNotification')

      version = '0.515.0-123123'
      @package.displayNotification(version)
      expect(Actions.postNotification).toHaveBeenCalled()

      notifOptions = Actions.postNotification.mostRecentCall.args[0]
      expect(notifOptions.message.indexOf(version) > 0).toBe(true)
 
    describe "when the action is taken", ->
      it "should fire the `application:install-update` IPC event", ->
        Actions.notificationActionTaken({notification: {}, action: {id: 'release-bar:install-update'}})
        expect(Array.prototype.slice.call(ipcSendArgs)).toEqual(['command', 'application:install-update'])

