// a test where we validate the siguature of the keys
// otherwise exactly the same as the ssl test

var server = require('./server')
  , assert = require('assert')
  , request = require('../main.js')
  , fs = require('fs')
  , path = require('path')
  , opts = { key: path.resolve(__dirname, 'ssl/ca/server.key')
           , cert: path.resolve(__dirname, 'ssl/ca/server.crt') }
  , s = server.createSSLServer(null, opts)
  , caFile = path.resolve(__dirname, 'ssl/ca/ca.crt')
  , ca = fs.readFileSync(caFile)

var tests =
  { testGet :
    { resp : server.createGetResponse("TESTING!")
    , expectBody: "TESTING!"
    }
  , testGetChunkBreak :
    { resp : server.createChunkResponse(
      [ new Buffer([239])
      , new Buffer([163])
      , new Buffer([191])
      , new Buffer([206])
      , new Buffer([169])
      , new Buffer([226])
      , new Buffer([152])
      , new Buffer([131])
      ])
    , expectBody: "Ω☃"
    }
  , testGetJSON :
    { resp : server.createGetResponse('{"test":true}', 'application/json')
    , json : true
    , expectBody: {"test":true}
    }
  , testPutString :
    { resp : server.createPostValidator("PUTTINGDATA")
    , method : "PUT"
    , body : "PUTTINGDATA"
    }
  , testPutBuffer :
    { resp : server.createPostValidator("PUTTINGDATA")
    , method : "PUT"
    , body : new Buffer("PUTTINGDATA")
    }
  , testPutJSON :
    { resp : server.createPostValidator(JSON.stringify({foo: 'bar'}))
    , method: "PUT"
    , json: {foo: 'bar'}
    }
  , testPutMultipart :
    { resp: server.createPostValidator(
        '--frontier\r\n' +
        'content-type: text/html\r\n' +
        '\r\n' +
        '<html><body>Oh hi.</body></html>' +
        '\r\n--frontier\r\n\r\n' +
        'Oh hi.' +
        '\r\n--frontier--'
        )
    , method: "PUT"
    , multipart:
      [ {'content-type': 'text/html', 'body': '<html><body>Oh hi.</body></html>'}
      , {'body': 'Oh hi.'}
      ]
    }
  }

s.listen(s.port, function () {

  var counter = 0

  for (i in tests) {
    (function () {
      var test = tests[i]
      s.on('/'+i, test.resp)
      test.uri = s.url + '/' + i
      test.strictSSL = true
      test.ca = ca
      test.headers = { host: 'testing.request.mikealrogers.com' }
      request(test, function (err, resp, body) {
        if (err) throw err
        if (test.expectBody) {
          assert.deepEqual(test.expectBody, body)
        }
        counter = counter - 1;
        if (counter === 0) {
          console.log(Object.keys(tests).length+" tests passed.")
          s.close()
        }
      })
      counter++
    })()
  }
})
