mirror of
https://github.com/discourse/discourse.git
synced 2025-05-31 20:45:35 +08:00

We already have beforeCreate and afterUpdate and it seems these hooks can be useful and it's also unexpected to not have parity on this.
145 lines
4.4 KiB
JavaScript
145 lines
4.4 KiB
JavaScript
QUnit.module("rest-model");
|
|
|
|
import createStore from "helpers/create-store";
|
|
import RestModel from "discourse/models/rest";
|
|
import RestAdapter from "discourse/adapters/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", async assert => {
|
|
const store = createStore();
|
|
const widget = await store.find("widget", 123);
|
|
assert.equal(widget.get("name"), "Trout Lure");
|
|
assert.ok(!widget.get("isSaving"), "it is not saving");
|
|
|
|
const spyBeforeUpdate = sandbox.spy(widget, "beforeUpdate");
|
|
const spyAfterUpdate = sandbox.spy(widget, "afterUpdate");
|
|
const promise = widget.update({ name: "new name" });
|
|
assert.ok(widget.get("isSaving"), "it is saving");
|
|
assert.ok(spyBeforeUpdate.calledOn(widget));
|
|
|
|
const result = await promise;
|
|
assert.ok(spyAfterUpdate.calledOn(widget));
|
|
assert.ok(!widget.get("isSaving"), "it is no longer saving");
|
|
assert.equal(widget.get("name"), "new name");
|
|
|
|
assert.ok(result.target, "it has a reference to the record");
|
|
assert.equal(result.target.name, widget.get("name"));
|
|
});
|
|
|
|
QUnit.test("updating simultaneously", async assert => {
|
|
assert.expect(2);
|
|
|
|
const store = createStore();
|
|
const widget = await store.find("widget", 123);
|
|
|
|
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", async 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"), "it is not saving");
|
|
|
|
const spyBeforeCreate = sandbox.spy(widget, "beforeCreate");
|
|
const spyAfterCreate = sandbox.spy(widget, "afterCreate");
|
|
const promise = widget.save({ name: "Evil Widget" });
|
|
assert.ok(widget.get("isSaving"), "it is not saving");
|
|
assert.ok(spyBeforeCreate.calledOn(widget));
|
|
|
|
const result = await promise;
|
|
assert.ok(spyAfterCreate.calledOn(widget));
|
|
assert.ok(!widget.get("isSaving"), "it is no longer saving");
|
|
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");
|
|
|
|
assert.ok(result.target, "it has a reference to the record");
|
|
assert.equal(result.target.name, widget.get("name"));
|
|
});
|
|
|
|
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);
|
|
});
|
|
});
|
|
});
|
|
|
|
QUnit.test("custom api name", async assert => {
|
|
const store = createStore(type => {
|
|
if (type === "adapter:my-widget") {
|
|
return RestAdapter.extend({
|
|
// An adapter like this is used when the server-side key/url
|
|
// do not match the name of the es6 class
|
|
apiNameFor() {
|
|
return "widget";
|
|
}
|
|
}).create();
|
|
}
|
|
});
|
|
|
|
// The pretenders only respond to requests for `widget`
|
|
// If these basic tests pass, the name override worked correctly
|
|
|
|
//Create
|
|
const widget = store.createRecord("my-widget");
|
|
await widget.save({ name: "Evil Widget" });
|
|
assert.equal(widget.id, 100, "it saved a new record successully");
|
|
assert.equal(widget.get("name"), "Evil Widget");
|
|
|
|
// Update
|
|
await widget.update({ name: "new name" });
|
|
assert.equal(widget.get("name"), "new name");
|
|
|
|
// Destroy
|
|
await widget.destroyRecord();
|
|
|
|
// Lookup
|
|
const foundWidget = await store.find("my-widget", 123);
|
|
assert.equal(foundWidget.name, "Trout Lure");
|
|
});
|