module('rest-model');

import createStore from 'helpers/create-store';
import RestModel from 'discourse/models/rest';

test('munging', function() {
  const store = createStore();
  const Grape = RestModel.extend();
  Grape.reopenClass({
    munge: function(json) {
      json.inverse = 1 - json.percent;
      return json;
    }
  });

  var g = Grape.create({ store, percent: 0.4 });
  equal(g.get('inverse'), 0.6, 'it runs `munge` on `create`');
});

test('update', function() {
  const store = createStore();
  return store.find('widget', 123).then(function(widget) {
    equal(widget.get('name'), 'Trout Lure');

    ok(!widget.get('isSaving'));
    const promise = widget.update({ name: 'new name' });
    ok(widget.get('isSaving'));
    promise.then(function() {
      ok(!widget.get('isSaving'));
      equal(widget.get('name'), 'new name');
    });
  });
});

test('updating simultaneously', function() {
  expect(2);

  const store = createStore();
  return store.find('widget', 123).then(function(widget) {

    const firstPromise = widget.update({ name: 'new name' });
    const secondPromise = widget.update({ name: 'new name' });
    firstPromise.then(function() {
      ok(true, 'the first promise succeeeds');
    });

    secondPromise.catch(function() {
      ok(true, 'the second promise fails');
    });
  });
});

test('save new', function() {
  const store = createStore();
  const widget = store.createRecord('widget');

  ok(widget.get('isNew'), 'it is a new record');
  ok(!widget.get('isCreated'), 'it is not created');
  ok(!widget.get('isSaving'));

  const promise = widget.save({ name: 'Evil Widget' });
  ok(widget.get('isSaving'));

  return promise.then(function() {
    ok(!widget.get('isSaving'));
    ok(widget.get('id'), 'it has an id');
    ok(widget.get('name'), 'Evil Widget');
    ok(widget.get('isCreated'), 'it is created');
    ok(!widget.get('isNew'), 'it is no longer new');
  });
});

test('creating simultaneously', function() {
  expect(2);

  const store = createStore();
  const widget = store.createRecord('widget');

  const firstPromise = widget.save({ name: 'Evil Widget' });
  const secondPromise = widget.save({ name: 'Evil Widget' });
  firstPromise.then(function() {
    ok(true, 'the first promise succeeeds');
  });

  secondPromise.catch(function() {
    ok(true, 'the second promise fails');
  });
});

test('destroyRecord', function() {
  const store = createStore();
  return store.find('widget', 123).then(function(widget) {
    widget.destroyRecord().then(function(result) {
      ok(result);
    });
  });
});