This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/test/javascripts/acceptance/bookmarks-test.js
Martin Brennan 6fb0f36ce1
FEATURE: Optionally delete bookmark when reminder sent (#9637)
We now show an options gear icon next to the bookmark name.

When expanded we show the "delete bookmark when reminder sent" option. The value of this checkbox is saved in local storage for the user.

If this is ticked, when a reminder is sent for the bookmark the bookmark itself is deleted. This is so people can use the reminder functionality by itself.

Also remove the blue alert reminder section from the "Edit Bookmark" modal as it just added clutter, because the user can already see they had a reminder set:

Adds a default false boolean column `delete_when_reminder_sent` to bookmarks.
2020-05-07 13:37:39 +10:00

256 lines
7.1 KiB
JavaScript

import {
acceptance,
loggedInUser,
fakeTime,
timeStep
} from "helpers/qunit-helpers";
import pretender from "helpers/create-pretender";
import { parsePostData } from "helpers/create-pretender";
acceptance("Bookmarking", {
loggedIn: true,
afterEach() {
sandbox.restore();
}
});
function handleRequest(assert, request) {
const data = parsePostData(request.requestBody);
assert.step(data.reminder_type || "none");
return [
200,
{
"Content-Type": "application/json"
},
{
id: 999,
success: "OK"
}
];
}
function mockSuccessfulBookmarkPost(assert) {
pretender.post("/bookmarks", request => handleRequest(assert, request));
pretender.put("/bookmarks/999", request => handleRequest(assert, request));
}
async function openBookmarkModal() {
if (exists(".topic-post:first-child button.show-more-actions")) {
await click(".topic-post:first-child button.show-more-actions");
}
await click(".topic-post:first-child button.bookmark");
}
async function openEditBookmarkModal() {
await click(".topic-post:first-child button.bookmarked");
}
test("Bookmarks modal opening", async assert => {
await visit("/t/internationalization-localization/280");
await openBookmarkModal();
assert.ok(exists("#bookmark-reminder-modal"), "it shows the bookmark modal");
});
test("Bookmarks modal selecting reminder type", async assert => {
mockSuccessfulBookmarkPost(assert);
await visit("/t/internationalization-localization/280");
await openBookmarkModal();
await click("#tap_tile_tomorrow");
await openBookmarkModal();
await click("#tap_tile_start_of_next_business_week");
await openBookmarkModal();
await click("#tap_tile_next_week");
await openBookmarkModal();
await click("#tap_tile_next_month");
await openBookmarkModal();
await click("#tap_tile_custom");
assert.ok(exists("#tap_tile_custom.active"), "it selects custom");
assert.ok(exists(".tap-tile-date-input"), "it shows the custom date input");
assert.ok(exists(".tap-tile-time-input"), "it shows the custom time input");
await click("#save-bookmark");
assert.verifySteps([
"tomorrow",
"start_of_next_business_week",
"next_week",
"next_month",
"custom"
]);
});
test("Saving a bookmark with a reminder", async assert => {
mockSuccessfulBookmarkPost(assert);
await visit("/t/internationalization-localization/280");
await openBookmarkModal();
await fillIn("input#bookmark-name", "Check this out later");
await click("#tap_tile_tomorrow");
assert.ok(
exists(".topic-post:first-child button.bookmark.bookmarked"),
"it shows the bookmarked icon on the post"
);
assert.ok(
exists(
".topic-post:first-child button.bookmark.bookmarked > .d-icon-discourse-bookmark-clock"
),
"it shows the bookmark clock icon because of the reminder"
);
assert.verifySteps(["tomorrow"]);
});
test("Opening the options panel and remembering the option", async assert => {
mockSuccessfulBookmarkPost(assert);
await visit("/t/internationalization-localization/280");
await openBookmarkModal();
await click(".bookmark-options-button");
assert.ok(
exists(".bookmark-options-panel"),
"it should open the options panel"
);
await click("#delete_when_reminder_sent");
await click("#save-bookmark");
await openEditBookmarkModal();
assert.ok(
exists(".bookmark-options-panel"),
"it should reopen the options panel"
);
assert.ok(
exists(".bookmark-options-panel #delete_when_reminder_sent:checked"),
"it should pre-check delete when reminder sent option"
);
assert.verifySteps(["none"]);
});
test("Saving a bookmark with no reminder or name", async assert => {
mockSuccessfulBookmarkPost(assert);
await visit("/t/internationalization-localization/280");
await openBookmarkModal();
await click("#save-bookmark");
assert.ok(
exists(".topic-post:first-child button.bookmark.bookmarked"),
"it shows the bookmarked icon on the post"
);
assert.not(
exists(
".topic-post:first-child button.bookmark.bookmarked > .d-icon-discourse-bookmark-clock"
),
"it shows the regular bookmark active icon"
);
assert.verifySteps(["none"]);
});
test("Deleting a bookmark with a reminder", async assert => {
pretender.delete("/bookmarks/999", () => [
200,
{
"Content-Type": "application/json"
},
{
success: "OK",
topic_bookmarked: false
}
]);
mockSuccessfulBookmarkPost(assert);
await visit("/t/internationalization-localization/280");
await openBookmarkModal();
await click("#tap_tile_tomorrow");
assert.verifySteps(["tomorrow"]);
await openEditBookmarkModal();
assert.ok(exists("#bookmark-reminder-modal"), "it shows the bookmark modal");
await click("#delete-bookmark");
assert.ok(exists(".bootbox.modal"), "it asks for delete confirmation");
assert.ok(
find(".bootbox.modal")
.text()
.includes(I18n.t("bookmarks.confirm_delete")),
"it shows delete confirmation message"
);
await click(".bootbox.modal .btn-primary");
assert.not(
exists(".topic-post:first-child button.bookmark.bookmarked"),
"it no longer shows the bookmarked icon on the post after bookmark is deleted"
);
});
test("Cancelling saving a bookmark", async assert => {
await visit("/t/internationalization-localization/280");
await openBookmarkModal();
await click(".d-modal-cancel");
assert.not(
exists(".topic-post:first-child button.bookmark.bookmarked"),
"it does not show the bookmarked icon on the post because it is not saved"
);
});
test("Editing a bookmark", async assert => {
mockSuccessfulBookmarkPost(assert);
await visit("/t/internationalization-localization/280");
let now = moment.tz(loggedInUser().resolvedTimezone());
let tomorrow = now.add(1, "day").format("YYYY-MM-DD");
await openBookmarkModal();
await fillIn("input#bookmark-name", "Test name");
await click("#tap_tile_tomorrow");
await openEditBookmarkModal();
assert.equal(
find("#bookmark-name").val(),
"Test name",
"it should prefill the bookmark name"
);
assert.equal(
find("#bookmark-custom-date > input").val(),
tomorrow,
"it should prefill the bookmark date"
);
assert.equal(
find("#bookmark-custom-time").val(),
"08:00",
"it should prefill the bookmark time"
);
assert.verifySteps(["tomorrow"]);
});
test("Editing a bookmark that has a Later Today reminder, and it is before 6pm today", async assert => {
mockSuccessfulBookmarkPost(assert);
let clock = fakeTime(
"2020-05-04T13:00:00",
loggedInUser().resolvedTimezone()
);
await timeStep(clock, () =>
visit("/t/internationalization-localization/280")
);
await timeStep(clock, () => openBookmarkModal());
await timeStep(clock, () => fillIn("input#bookmark-name", "Test name"));
await timeStep(clock, () => click("#tap_tile_later_today"));
await timeStep(clock, () => openEditBookmarkModal());
assert.not(
exists("#bookmark-custon-date > input"),
"it does not show the custom date input"
);
assert.ok(
exists("#tap_tile_later_today.active"),
"it preselects Later Today"
);
assert.verifySteps(["later_today"]);
});