QUnit.module('rest-model');

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

QUnit.test('munging', assert => {
  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 });
  assert.equal(g.get('inverse'), 0.6, 'it runs `munge` on `create`');
});

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

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

QUnit.test('updating simultaneously', assert => {
  assert.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() {
      assert.ok(true, 'the first promise succeeeds');
    });

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

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

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

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

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

QUnit.test('creating simultaneously', assert => {
  assert.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() {
    assert.ok(true, 'the first promise succeeeds');
  });

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

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