import { module, test } from "qunit";
import { getOwner } from "discourse-common/lib/get-owner";
import { setupTest } from "ember-qunit";

module("Unit | Model | post", function (hooks) {
  setupTest(hooks);

  hooks.beforeEach(function () {
    this.store = getOwner(this).lookup("service:store");
  });

  test("defaults", function (assert) {
    const post = this.store.createRecord("post", { id: 1 });
    assert.blank(post.deleted_at, "it has no deleted_at by default");
    assert.blank(post.deleted_by, "there is no deleted_by by default");
  });

  test("new_user", function (assert) {
    const post = this.store.createRecord("post", { trust_level: 0 });
    assert.ok(post.new_user, "post is from a new user");

    post.set("trust_level", 1);
    assert.ok(!post.new_user, "post is no longer from a new user");
  });

  test("firstPost", function (assert) {
    const post = this.store.createRecord("post", { post_number: 1 });
    assert.ok(post.firstPost, "it's the first post");

    post.set("post_number", 10);
    assert.ok(!post.firstPost, "post is no longer the first post");
  });

  test("updateFromPost", function (assert) {
    const post = this.store.createRecord("post", {
      post_number: 1,
      raw: "hello world",
    });

    post.updateFromPost(
      this.store.createRecord("post", {
        raw: "different raw",
      })
    );

    assert.strictEqual(post.raw, "different raw", "raw field updated");
  });

  test("destroy by staff", async function (assert) {
    const user = this.store.createRecord("user", {
      username: "staff",
      moderator: true,
    });
    const post = this.store.createRecord("post", {
      id: 1,
      can_delete: true,
      version: 1,
      user,
    });

    await post.destroy(user);

    assert.present(post.deleted_at, "it has a `deleted_at` field.");
    assert.strictEqual(
      post.deleted_by,
      user,
      "it has the user in the `deleted_by` field"
    );

    await post.recover();

    assert.blank(post.deleted_at, "it clears `deleted_at` when recovering");
    assert.blank(post.deleted_by, "it clears `deleted_by` when recovering");
  });

  test("destroy by non-staff", async function (assert) {
    const originalCooked = "this is the original cooked value";
    const user = this.store.createRecord("user", { username: "evil trout" });
    const post = this.store.createRecord("post", {
      id: 1,
      can_delete: true,
      version: 1,
      user,
      cooked: originalCooked,
    });

    await post.destroy(user);

    assert.ok(
      !post.can_delete,
      "the post can't be deleted again in this session"
    );
    assert.ok(post.cooked !== originalCooked, "the cooked content changed");
    assert.strictEqual(post.version, 2, "the version number increased");
  });
});
