import Category from "discourse/models/category"; import EmberObject from "@ember/object"; import Topic from "discourse/models/topic"; import User from "discourse/models/user"; import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import { test } from "qunit"; import { IMAGE_VERSION as v } from "pretty-text/emoji/version"; discourseModule("Unit | Model | topic", function () { test("defaults", function (assert) { const topic = Topic.create({ id: 1234 }); assert.blank(topic.get("deleted_at"), "deleted_at defaults to blank"); assert.blank(topic.get("deleted_by"), "deleted_by defaults to blank"); }); test("visited", function (assert) { const topic = Topic.create({ highest_post_number: 2, last_read_post_number: 1, }); assert.not( topic.get("visited"), "not visited unless we've read all the posts" ); topic.set("last_read_post_number", 2); assert.ok(topic.get("visited"), "is visited once we've read all the posts"); topic.set("last_read_post_number", 3); assert.ok( topic.get("visited"), "is visited if we've read all the posts and some are deleted at the end" ); }); test("lastUnreadUrl", function (assert) { const category = EmberObject.create({ navigate_to_first_post_after_read: true, }); const topic = Topic.create({ id: 101, highest_post_number: 10, last_read_post_number: 10, slug: "hello", }); topic.set("category", category); assert.strictEqual(topic.get("lastUnreadUrl"), "/t/hello/101/1"); }); test("has details", function (assert) { const topic = Topic.create({ id: 1234 }); const topicDetails = topic.get("details"); assert.present(topicDetails, "a topic has topicDetails after we create it"); assert.strictEqual( topicDetails.get("topic"), topic, "the topicDetails has a reference back to the topic" ); }); test("has a postStream", function (assert) { const topic = Topic.create({ id: 1234 }); const postStream = topic.get("postStream"); assert.present(postStream, "a topic has a postStream after we create it"); assert.strictEqual( postStream.get("topic"), topic, "the postStream has a reference back to the topic" ); }); test("has suggestedTopics", function (assert) { const topic = Topic.create({ suggested_topics: [{ id: 1 }, { id: 2 }] }); const suggestedTopics = topic.get("suggestedTopics"); assert.strictEqual( suggestedTopics.length, 2, "it loaded the suggested_topics" ); assert.containsInstance(suggestedTopics, Topic); }); test("category relationship", function (assert) { // It finds the category by id const category = Category.list()[0]; const topic = Topic.create({ id: 1111, category_id: category.get("id") }); assert.strictEqual(topic.get("category"), category); }); test("updateFromJson", function (assert) { const topic = Topic.create({ id: 1234 }); const category = Category.list()[0]; topic.updateFromJson({ post_stream: [1, 2, 3], details: { hello: "world" }, cool: "property", category_id: category.get("id"), }); assert.blank(topic.get("post_stream"), "it does not update post_stream"); assert.strictEqual( topic.get("details.hello"), "world", "it updates the details" ); assert.strictEqual( topic.get("cool"), "property", "it updates other properties" ); assert.strictEqual(topic.get("category"), category); }); test("recover", async function (assert) { const user = User.create({ username: "eviltrout" }); const topic = Topic.create({ id: 1234, deleted_at: new Date(), deleted_by: user, }); await topic.recover(); assert.blank(topic.get("deleted_at"), "it clears deleted_at"); assert.blank(topic.get("deleted_by"), "it clears deleted_by"); }); test("fancyTitle", function (assert) { const topic = Topic.create({ fancy_title: ":smile: with all :) the emojis :pear::peach:", }); assert.strictEqual( topic.get("fancyTitle"), `smile with all slight_smile the emojis pearpeach`, "supports emojis" ); }); test("fancyTitle direction", function (assert) { const rtlTopic = Topic.create({ fancy_title: "هذا اختبار" }); const ltrTopic = Topic.create({ fancy_title: "This is a test" }); this.siteSettings.support_mixed_text_direction = true; assert.strictEqual( rtlTopic.get("fancyTitle"), `هذا اختبار`, "sets the dir-span to rtl" ); assert.strictEqual( ltrTopic.get("fancyTitle"), `This is a test`, "sets the dir-span to ltr" ); }); test("excerpt", function (assert) { const topic = Topic.create({ excerpt: "This is a test topic :smile:", pinned: true, }); assert.strictEqual( topic.get("escapedExcerpt"), `This is a test topic smile`, "supports emojis" ); }); test("visible & invisible", function (assert) { const topic = Topic.create(); assert.strictEqual(topic.visible, undefined); assert.strictEqual(topic.invisible, undefined); const visibleTopic = Topic.create({ visible: true }); assert.strictEqual(visibleTopic.visible, true); assert.strictEqual(visibleTopic.invisible, false); const invisibleTopic = Topic.create({ visible: false }); assert.strictEqual(invisibleTopic.visible, false); assert.strictEqual(invisibleTopic.invisible, true); }); });