// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

var test = require('prova');
var vanadium = require('../../');
var NoExistError = vanadium.verror.NoExistError;
var config = require('./default-config');
var service = require('./get-service');
var Promise = require('bluebird');

test('Test set() of Go sample cache service - ' +
  'cache.set(key, value, callback)', function(assert) {
  service('test_service/cache', function(err, ctx, cache, end) {
    assert.error(err);
    if (err) {
      return end(assert);
    }

    cache.set(ctx, 'foo', 'bar', function(err, result) {
      assert.error(err);
      end(assert);
    });
  });
});

test('Test set() of Go sample cache service - ' +
  'var promise = cache.set(key, value)', function(assert) {
  service('test_service/cache', function(err, ctx, cache, end) {
    assert.error(err);
    if (err) {
      return end(assert);
    }

    cache.set(ctx, 'foo', 'bar')
    .then(function() {
      end(assert);
    }, function(err) {
      assert.err(err);
      end(assert);
    });
  });
});

test('Test get() of Go sample cache service - ' +
  'cache.get(key, value, callback)', function(assert) {
  service('test_service/cache', function(err, ctx, cache, end) {
    assert.error(err);
    if (err) {
      return end(assert);
    }

    cache.set(ctx, 'baz', 'qux', function(err, result) {
      assert.error(err);

      cache.get(ctx, 'baz', function(err, value) {
        assert.error(err);
        assert.equal(value, 'qux');
        end(assert);
      });
    });
  });
});

test('Test get() of Go sample cache service - ' +
  'var promise = cache.get(key, value)', function(assert) {
  service('test_service/cache', function(err, ctx, cache, end) {
    assert.error(err);
    if (err) {
      return end(assert);
    }

    cache.set(ctx, 'baz', 'qux')
    .then(function() {
      return cache.get(ctx, 'baz');
    })
    .then(function(value) {
      assert.equal(value, 'qux');
      end(assert);
    })
    .catch(function(err) {
      // I dont think this does what I think it does
      assert.error(err);
      end(assert);
    });
  });
});

test('Test get() with invalid key of Go sample cache service - ' +
  'cache.get(key, value, callback)', function(assert) {
  service('test_service/cache', function(err, ctx, cache, end) {
    assert.error(err);
    if (err) {
      return end(assert);
    }

    cache.get(ctx, 'is not a thing', function(err, value) {
      assert.ok(err instanceof NoExistError, 'should error');
      assert.ok(err.message, 'test_serviced:"cache".Get: ' +
        'Does not exist: is not a thing');
      end(assert);
    });
  });
});

test('Test get() with invalid key of Go sample cache service - ' +
  'var promise = cache.get(key, value) - failure', function(assert) {
  service('test_service/cache', function(err, ctx, cache, end) {
    assert.error(err);
    if (err) {
      return end(assert);
    }

    cache
    .get(ctx, 'really not a thing')
    .then(function() {
      assert.fail('should not succeed');
      end(assert);
    })
    .catch(function(err) {
      assert.ok(err instanceof NoExistError, 'should error');
      assert.ok(err.message, 'test_serviced:"cache".Get: ' +
        'Does not exist: really not a thing');
      end(assert);
    });
  });
});

test('Test calling a non-existing method of Go sample cache service - ' +
  'cache.badMethod()', function(assert) {
  service('test_service/cache', function(err, ctx, cache, end) {
    assert.error(err);
    if (err) {
      return end(assert);
    }

    assert.throws(function() {
      // The cache stub doesn't have this method.
      cache.notEvenAThing('whatever');
    });

    end(assert);
  });
});

test('Test multiGet() streaming method of Go sample cache service - ' +
  'var stream = cache.multiGet().stream', function(assert) {
  service('test_service/cache', function(err, ctx, cache, end) {
    assert.error(err);
    if (err) {
      return end(assert);
    }

    // `cache.mutliGet()` returns an object that has a "stream" attribute.
    // The way the streaming interface is implmented for cache.mutliGet()
    // is that you use stream.write(key) to get the value of a key. The value
    // is emitted on the stream's data event. In this test there are a few
    //  steps to set this up:
    //
    // * Prime the cache by setting a bunch of key/values
    // * Add a listener or create a stream reader to recieve the values
    // * Assert the values are correct
    // * End the stream.

    // Build a map of items
    var items = {};
    for (var i = 0; i < 10; ++i) {
      items[i] = {
        key: i,
        value: 'next value: ' + i
      };
    }

    // Add them to the cache
    var jobs = Object.keys(items).map(function(key) {
      return cache.set(ctx, key, JSON.stringify(items[key]));
    });

    Promise
    .all(jobs)
    .then(function() {
      var promise = cache.multiGet(ctx);
      var stream = promise.stream;

      // Error handling boilerplate
      promise.catch(error);
      stream.on('error', error);

      // "data" event emits cached values
      stream.on('data', function(value) {
        var string = value.toString();
        var json = JSON.parse(string);
        var actual = json.value;
        var expected = items[json.key].value;

        assert.equal(actual, expected);
      });

      stream.on('end', function() {
        end(assert);
      });

      Object.keys(items).forEach(function(key) {
        stream.write(key);
      });

      stream.end();
    });

    function error(err) {
      assert.error(err);
      end(assert);
    }
  });
});

test('Test getting signature of Go sample cache service - ' +
  'var promise = client.signature(ctx, test_service/cache)', function(assert) {
  vanadium.init(config)
  .then(function(runtime) {
    var ctx = runtime.getContext();
    var client = runtime.newClient();
    client.signature(ctx, 'test_service/cache')
    .then(function(sigs) {
      assert.ok(sigs, 'received something');
      assert.ok(Array.isArray(sigs), 'receives a signature array');
      runtime.close(assert.end);
    }).catch(function(err) {
      assert.error(err);
      runtime.close(assert.end);
    });
  }).catch(assert.end);
});

test('Test getting signature of Go sample cache service - ' +
  'client.signature(ctx, test_service/cache, callback)', function(assert) {
  vanadium.init(config, function(err, runtime) {
    if(err) {
      assert.end(err);
    }

    var ctx = runtime.getContext();
    var client = runtime.newClient();
    client.signature(ctx, 'test_service/cache', function(err, sigs) {
      assert.error(err);
      assert.ok(sigs, 'received something');
      assert.ok(Array.isArray(sigs), 'receives a signature array');
      runtime.close(assert.end);
    });
  });
});

test('Test a streaming method timing out - ' +
  'var promise = cache.multiGet(shortTimeout)', function(assert) {
  service('test_service/cache', function(err, ctx, cache, end) {
    assert.error(err);
    if (err) {
      return end(assert);
    }

    var shortCtx = ctx.withTimeout(10); // very short timeout
    var promise = cache.multiGet(shortCtx); // streaming method
    promise.then(function success() {
      assert.fail('Should have timedout and errored but succeeded');
      end(assert);
    }, function error() {
      assert.pass('Steaming method timedout correctly');
      end(assert);
    });
  });
});
