A public key must be added to GitHub when installing private themes. When the process happens asynchronously (for example if the admin does not have admin permissions to the GitHub repository), installing private themes becomes very difficult. In this case, the Discourse admin can partially install the theme by letting Discourse save the private key, create a placeholder theme and give the admin a public key to be used as a deploy key. After the key is installed, the admin can finish theme installation by pressing a button on the theme page.
244 lines
7.2 KiB
JavaScript
244 lines
7.2 KiB
JavaScript
import { click, fillIn, visit } from "@ember/test-helpers";
|
|
import {
|
|
acceptance,
|
|
exists,
|
|
query,
|
|
} from "discourse/tests/helpers/qunit-helpers";
|
|
import I18n from "I18n";
|
|
import { test } from "qunit";
|
|
|
|
acceptance("Theme", function (needs) {
|
|
needs.user();
|
|
|
|
needs.pretender((server, helper) => {
|
|
server.get("/admin/themes", () => {
|
|
return helper.response(200, {
|
|
themes: [
|
|
{
|
|
id: 42,
|
|
name: "discourse-incomplete-theme",
|
|
created_at: "2022-01-01T12:00:00.000Z",
|
|
updated_at: "2022-01-01T12:00:00.000Z",
|
|
component: false,
|
|
color_scheme: null,
|
|
color_scheme_id: null,
|
|
user_selectable: false,
|
|
auto_update: true,
|
|
remote_theme_id: 42,
|
|
settings: [],
|
|
supported: true,
|
|
description: null,
|
|
enabled: true,
|
|
user: {
|
|
id: 1,
|
|
username: "foo",
|
|
name: null,
|
|
avatar_template:
|
|
"/letter_avatar_proxy/v4/letter/f/3be4f8/{size}.png",
|
|
title: "Tester",
|
|
},
|
|
theme_fields: [],
|
|
child_themes: [],
|
|
parent_themes: [],
|
|
remote_theme: {
|
|
id: 42,
|
|
remote_url:
|
|
"git@github.com:discourse/discourse-incomplete-theme.git",
|
|
remote_version: null,
|
|
local_version: null,
|
|
commits_behind: null,
|
|
branch: null,
|
|
remote_updated_at: null,
|
|
updated_at: "2022-01-01T12:00:00.000Z",
|
|
last_error_text: null,
|
|
is_git: true,
|
|
license_url: null,
|
|
about_url: null,
|
|
authors: null,
|
|
theme_version: null,
|
|
minimum_discourse_version: null,
|
|
maximum_discourse_version: null,
|
|
},
|
|
translations: [],
|
|
},
|
|
],
|
|
});
|
|
});
|
|
|
|
server.post("/admin/themes/import", (request) => {
|
|
const data = helper.parsePostData(request.requestBody);
|
|
|
|
if (!data.force) {
|
|
return helper.response(422, {
|
|
errors: [
|
|
"Error cloning git repository, access is denied or repository is not found",
|
|
],
|
|
});
|
|
}
|
|
|
|
return helper.response(201, {
|
|
theme: {
|
|
id: 42,
|
|
name: "discourse-inexistent-theme",
|
|
created_at: "2022-01-01T12:00:00.000Z",
|
|
updated_at: "2022-01-01T12:00:00.000Z",
|
|
component: false,
|
|
color_scheme: null,
|
|
color_scheme_id: null,
|
|
user_selectable: false,
|
|
auto_update: true,
|
|
remote_theme_id: 42,
|
|
settings: [],
|
|
supported: true,
|
|
description: null,
|
|
enabled: true,
|
|
user: {
|
|
id: 1,
|
|
username: "foo",
|
|
name: null,
|
|
avatar_template:
|
|
"/letter_avatar_proxy/v4/letter/f/3be4f8/{size}.png",
|
|
},
|
|
theme_fields: [],
|
|
child_themes: [],
|
|
parent_themes: [],
|
|
remote_theme: {
|
|
id: 42,
|
|
remote_url:
|
|
"git@github.com:discourse/discourse-inexistent-theme.git",
|
|
remote_version: null,
|
|
local_version: null,
|
|
commits_behind: null,
|
|
branch: null,
|
|
remote_updated_at: null,
|
|
updated_at: "2022-01-01T12:00:00.000Z",
|
|
last_error_text: null,
|
|
is_git: true,
|
|
license_url: null,
|
|
about_url: null,
|
|
authors: null,
|
|
theme_version: null,
|
|
minimum_discourse_version: null,
|
|
maximum_discourse_version: null,
|
|
},
|
|
translations: [],
|
|
},
|
|
});
|
|
});
|
|
|
|
server.put("/admin/themes/42", () => {
|
|
return helper.response(200, {
|
|
theme: {
|
|
id: 42,
|
|
name: "discourse-complete-theme",
|
|
created_at: "2022-01-01T12:00:00.000Z",
|
|
updated_at: "2022-01-01T12:00:00.000Z",
|
|
component: false,
|
|
color_scheme: null,
|
|
color_scheme_id: null,
|
|
user_selectable: false,
|
|
auto_update: true,
|
|
remote_theme_id: 42,
|
|
settings: [],
|
|
supported: true,
|
|
description: null,
|
|
enabled: true,
|
|
user: {
|
|
id: 1,
|
|
username: "foo",
|
|
name: null,
|
|
avatar_template:
|
|
"/letter_avatar_proxy/v4/letter/f/3be4f8/{size}.png",
|
|
},
|
|
theme_fields: [],
|
|
child_themes: [],
|
|
parent_themes: [],
|
|
remote_theme: {
|
|
id: 42,
|
|
remote_url:
|
|
"git@github.com:discourse-org/discourse-incomplete-theme.git",
|
|
remote_version: "0000000000000000000000000000000000000000",
|
|
local_version: "0000000000000000000000000000000000000000",
|
|
commits_behind: 0,
|
|
branch: null,
|
|
remote_updated_at: "2022-01-01T12:00:30.000Z",
|
|
updated_at: "2022-01-01T12:00:30.000Z",
|
|
last_error_text: null,
|
|
is_git: true,
|
|
license_url: "URL",
|
|
about_url: "URL",
|
|
authors: null,
|
|
theme_version: null,
|
|
minimum_discourse_version: null,
|
|
maximum_discourse_version: null,
|
|
},
|
|
translations: [],
|
|
},
|
|
});
|
|
});
|
|
});
|
|
|
|
test("can force install themes", async function (assert) {
|
|
await visit("/admin/customize/themes");
|
|
|
|
await click(".themes-list .create-actions button");
|
|
await click(".install-theme-items #remote");
|
|
await fillIn(
|
|
".install-theme-content .repo input",
|
|
"git@github.com:discourse/discourse-inexistent-theme.git"
|
|
);
|
|
await click(".install-theme-content button.advanced-repo");
|
|
await click(".install-theme-content .check-private input");
|
|
|
|
assert.notOk(
|
|
exists(".admin-install-theme-modal .modal-footer .install-theme-warning"),
|
|
"no Git warning is displayed"
|
|
);
|
|
|
|
await click(".admin-install-theme-modal .modal-footer .btn-primary");
|
|
assert.ok(
|
|
exists(".admin-install-theme-modal .modal-footer .install-theme-warning"),
|
|
"Git warning is displayed"
|
|
);
|
|
|
|
await click(".admin-install-theme-modal .modal-footer .btn-danger");
|
|
|
|
assert.notOk(
|
|
exists(".admin-install-theme-modal:visible"),
|
|
"modal is closed"
|
|
);
|
|
});
|
|
|
|
test("can continue installation", async function (assert) {
|
|
await visit("/admin/customize/themes");
|
|
|
|
await click(".themes-list-container .themes-list-item");
|
|
assert.ok(
|
|
query(".control-unit .status-message").innerText.includes(
|
|
I18n.t("admin.customize.theme.last_attempt")
|
|
),
|
|
"it says that theme is not completely installed"
|
|
);
|
|
|
|
await click(".control-unit .btn-primary.finish-install");
|
|
|
|
assert.equal(
|
|
query(".show-current-style .title span").innerText,
|
|
"discourse-complete-theme",
|
|
"it updates theme title"
|
|
);
|
|
|
|
assert.notOk(
|
|
query(".metadata.control-unit").innerText.includes(
|
|
I18n.t("admin.customize.theme.last_attempt")
|
|
),
|
|
"it does not say that theme is not completely installed"
|
|
);
|
|
|
|
assert.notOk(
|
|
query(".control-unit .btn-primary.finish-install"),
|
|
"it does not show finish install button"
|
|
);
|
|
});
|
|
});
|