app = require './project/server'
users = require './fixtures/users'
requests = require('./helpers/requests')(app)
request = require 'request'
require 'should'

describe 'Signup', ->

  body = null

  before (done) ->
    #    app.listen app.settings.port
    done()

  beforeEach (done) ->
    users.clear done

  describe 'form', ->

    before (done) ->
      request requests.signupForm, (err, res, _body) ->
        body = _body
        done()

    it 'should have a First Name field', (done) ->
      body.should.include 'name="name.first"'
      done()

    it 'should have a Last Name field', (done) ->
      body.should.include 'name="name.last"'
      done()

    it 'should have an Email field', (done) ->
      body.should.include 'name="email"'
      done()

    it 'should have a Password field', (done) ->
      body.should.include 'name="password"'
      body.should.include 'type="password"'
      done()

    it 'should have a Confirm Password field', (done) ->
      body.should.include 'name="confirm_password"'
      body.should.include 'type="password"'
      done()

    it 'should have a Login button', (done) ->
      body.should.include 'type="submit"'
      done()

  describe 'with valid details', ->

    guest = users.build 'guest'

    before (done) ->
      req = requests.signup 'guest'
      request req, (err, res, _body) ->
        body = _body
        done()

    it 'should log in the user', (done) ->
      body.should.include 'Logout'
      done()

    it 'should greet the user', (done) ->
      body.should.include guest.name.full
      done()

    it 'should flash a success message', (done) ->
      body.should.include 'Signed up successfully'
      done()

  describe 'with an empty form', ->

    it 'should flash an error', (done) ->
      request requests.signup(), (err, res, body) ->
        res.body.should.include 'Validation failed'
        done()


  describe 'with invalid details', ->
    before (done) ->
      req = requests.signup
        'name.first': 'John'
        'name.last': 'Coltrane'
        email: 'invalid'
        password: 'secret'
      request req, (err, res, _body) ->
        body = _body
        done()

    it 'should remember the submitted first name', (done) ->
      body.should.include 'value="John"'
      done()

    it 'should remember the submitted last name', (done) ->
      body.should.include 'value="Coltrane"'
      done()

    it 'should remember the submitted email', (done) ->
      body.should.include 'value="invalid"'
      done()

  describe 'with an existing user\'s email', (done) ->

    guest = users.build 'guest'

    beforeEach (done) ->
      guest.save (err) ->
        done()

    it 'should inform the user they are already signed up', (done) ->
      req = requests.signup
        'name.first': guest.name.first
        'name.last': guest.name.last
        email: guest.email
        password: 'secret'
        confirm_password: 'secret'

      request req, (err, res, body) ->
        body.should.include "#{guest.email} is already signed up"
        done()

  describe 'with a', ->

    req = null

    signup =
      'name.first': 'John'
      'name.last': 'Coltrane'
      email: 'john@example.com'
      password: 'secret'

    describe 'missing first name', ->
  
      before (done) ->
        req = requests.signup signup
        req.form['name.first'] = ''
        request req, (err, res, _body) ->
          body = _body
          done()

      it 'should highlight the field', (done) ->
        body.should.include 'control-group error'
        done()

      it 'should display an error', (done) ->
        body.should.include 'required'
        done()


    describe 'missing last name', ->
  
      before (done) ->
        req = requests.signup signup
        req.form['name.last'] = ''
        request req, (err, res, _body) ->
          body = _body
          done()

      it 'should highlight the field', (done) ->
        body.should.include 'control-group error'
        done()

      it 'should display an error', (done) ->
        body.should.include 'required'
        done()

    describe 'missing email', ->
  
      before (done) ->
        req = requests.signup signup
        req.form.email = ''
        request req, (err, res, _body) ->
          body = _body
          done()

      it 'should highlight the field', (done) ->
        body.should.include 'control-group error'
        done()

      it 'should display an error', (done) ->
        body.should.include 'required'
        done()

    describe 'invalid email', ->
  
      before (done) ->
        req = requests.signup signup
        req.form.email = 'non-email-value'
        request req, (err, res, _body) ->
          body = _body
          done()

      it 'should highlight the field', (done) ->
        body.should.include 'control-group error'
        done()

      it 'should display an error', (done) ->
        body.should.include 'email is invalid'
        done()

    describe 'missing password', ->
  
      before (done) ->
        req = requests.signup signup
        req.form.password = ''
        request req, (err, res, _body) ->
          body = _body
          done()

      it 'should highlight the field', (done) ->
        body.should.include 'control-group error'
        done()

      it 'should display an error', (done) ->
        body.should.include 'password can\'t be empty'
        done()

  describe 'when disabled', ->

    before (done) ->
      app.set 'signups', false
      done()

    it 'should not show the signup form', (done) ->
      request requests.signupForm, (err, res, body) ->
        body.should.include '404 Not Found'
        done()

    it 'should not register a user', (done) ->
      request requests.signup('guest'), (err, res, body) ->
        body.should.include '404 Not Found'
        done()

