###
Module dependencies.
###
should = require 'should'
authenticationHandler = require '../src/connect-vtexid'
vtexidApiMock = require './mocks/vtexid-api.mock'

describe '#authenticationHandler()', ->

  handlerOptions =
    verbosityLevel: 0

  it 'should exist as a public function', (done) ->
    authenticationHandler.should.be.a.Function
    done()

  it 'should skip to next middleware if req.url is in white list', (done) ->

    req = url: '/admin/Scripts'
    middleware = authenticationHandler(handlerOptions)

    middleware req, {}, ->
      done()

  it 'should redirect to login page if VtexIdclientAutCookie was not found', (done) ->

    req =
      url: '/admin/checkout'
      headers: {}

    res =
      headers: {}
      setHeader: (header, value) ->
        this.headers[header] = value
      end: ->
        this.headers["Location"].should.be.equal '/admin/login?ReturnUrl=/admin/checkout'
        this.statusCode.should.equal 302
        done()

    middleware = authenticationHandler(handlerOptions)

    middleware req, res

  it 'should consult vtexid api if user is not cached', (done) ->

    req =
      url: '/admin/checkout'
      headers:
        cookie: 'VtexIdclientAutCookie=authUser'

    res = {}

    middleware = authenticationHandler(handlerOptions)

    middleware req, res, ->
      req.should.have.property 'vtex'
      req.vtex.should.have.property 'vtexIdData'
      req.vtex.vtexIdData.should.have.keys ['userId', 'user', 'userType', 'fromCache']
      req.vtex.vtexIdData.user.should.be.equal 'vitor.mattos@vtex.com.br'
      req.vtex.vtexIdData.fromCache.should.be.equal false
      done()

  it 'should redirect to logout page if vtexid api\'s response was null',(done) ->

    req =
      url: '/admin/checkout'
      headers:
        cookie: 'VtexIdclientAutCookie=null'

    res =
      headers: {}
      setHeader: (header, value) ->
        this.headers[header] = value
      end: ->
        this.headers["Location"].should.be.equal '/admin/logout?previousUrl=/admin/checkout'
        this.statusCode.should.equal 302
        done()
    middleware = authenticationHandler(handlerOptions)

    middleware req, res

  it 'should redirect to logout page if vtexid api responded an error', (done) ->

    req =
      url: '/admin/checkout'
      headers:
        cookie: 'VtexIdclientAutCookie=error'

    res =
      headers: {}
      setHeader: (header, value) ->
        this.headers[header] = value
      end: ->
        this.headers["Location"].should.be.equal '/admin/logout?previousUrl=/admin/checkout'
        this.statusCode.should.equal 302
        done()
    middleware = authenticationHandler(handlerOptions)

    middleware req, res

  it 'should return user from cache', (done) ->

    req =
      url: '/admin/checkout'
      headers:
        cookie: 'VtexIdclientAutCookie=authUser'

    res = {}

    middleware = authenticationHandler(handlerOptions)

    middleware req, res, ->
      middleware req, res, ->
        req.vtex.vtexIdData.should.have.keys ['userId', 'user', 'userType', 'fromCache']
        req.vtex.vtexIdData.fromCache.should.be.equal true
        done()