import EmberObject from "@ember/object"; import { IMAGE_VERSION as v } from "pretty-text/emoji/version"; import Category from "discourse/models/category"; import Topic from "discourse/models/topic"; import User from "discourse/models/user"; import { discourseModule } from "helpers/qunit-helpers"; discourseModule("model:topic"); QUnit.test("defaults", 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"); }); QUnit.test("visited", 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" ); }); QUnit.test("lastUnreadUrl", 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.equal(topic.get("lastUnreadUrl"), "/t/hello/101/1"); }); QUnit.test("has details", assert => { const topic = Topic.create({ id: 1234 }); const topicDetails = topic.get("details"); assert.present(topicDetails, "a topic has topicDetails after we create it"); assert.equal( topicDetails.get("topic"), topic, "the topicDetails has a reference back to the topic" ); }); QUnit.test("has a postStream", 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.equal( postStream.get("topic"), topic, "the postStream has a reference back to the topic" ); }); QUnit.test("has suggestedTopics", assert => { const topic = Topic.create({ suggested_topics: [{ id: 1 }, { id: 2 }] }); const suggestedTopics = topic.get("suggestedTopics"); assert.equal(suggestedTopics.length, 2, "it loaded the suggested_topics"); assert.containsInstance(suggestedTopics, Topic); }); QUnit.test("category relationship", assert => { // It finds the category by id const category = Category.list()[0]; const topic = Topic.create({ id: 1111, category_id: category.get("id") }); assert.equal(topic.get("category"), category); }); QUnit.test("updateFromJson", 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.equal(topic.get("details.hello"), "world", "it updates the details"); assert.equal(topic.get("cool"), "property", "it updates other properties"); assert.equal(topic.get("category"), category); }); QUnit.test("recover", assert => { const user = User.create({ username: "eviltrout" }); const topic = Topic.create({ id: 1234, deleted_at: new Date(), deleted_by: user }); topic.recover(); assert.blank(topic.get("deleted_at"), "it clears deleted_at"); assert.blank(topic.get("deleted_by"), "it clears deleted_by"); }); QUnit.test("fancyTitle", assert => { const topic = Topic.create({ fancy_title: ":smile: with all :) the emojis :pear::peach:" }); assert.equal( topic.get("fancyTitle"), `<img src='/images/emoji/emoji_one/smile.png?v=${v}' title='smile' alt='smile' class='emoji'> with all <img src='/images/emoji/emoji_one/slight_smile.png?v=${v}' title='slight_smile' alt='slight_smile' class='emoji'> the emojis <img src='/images/emoji/emoji_one/pear.png?v=${v}' title='pear' alt='pear' class='emoji'><img src='/images/emoji/emoji_one/peach.png?v=${v}' title='peach' alt='peach' class='emoji'>`, "supports emojis" ); }); QUnit.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.equal( rtlTopic.get("fancyTitle"), `<span dir="rtl">هذا اختبار</span>`, "sets the dir-span to rtl" ); assert.equal( ltrTopic.get("fancyTitle"), `<span dir="ltr">This is a test</span>`, "sets the dir-span to ltr" ); }); QUnit.test("excerpt", assert => { const topic = Topic.create({ excerpt: "This is a test topic :smile:", pinned: true }); assert.equal( topic.get("escapedExcerpt"), `This is a test topic <img src='/images/emoji/emoji_one/smile.png?v=${v}' title='smile' alt='smile' class='emoji'>`, "supports emojis" ); });