1
0
Fork 0

Merge pull request #147 from paviliondev/pro-release-api

Pro release api
Dieser Commit ist enthalten in:
Angus McLeod 2021-11-17 20:18:54 +08:00 committet von GitHub
Commit bbd1253891
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 4AEE18F83AFDEB23
48 geänderte Dateien mit 427 neuen und 165 gelöschten Zeilen

Datei anzeigen

@ -1,27 +1,27 @@
import Component from "@ember/component";
import discourseComputed, { observes } from "discourse-common/utils/decorators";
import { alias, equal, or } from "@ember/object/computed";
import { computed } from "@ember/object";
import I18n from "I18n";
const klasses = ["topic", "post", "group", "category"];
const types = ["string", "boolean", "integer", "json"];
const subscriptionTypes = {
klass: ["group", "category"],
type: ["json"],
};
import wizardSchema, {
requiringAdditionalSubscription,
subscriptionLevel,
} from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard-schema";
const generateContent = function (array, type, subscribed = false) {
return array.reduce((result, key) => {
let subArr = subscriptionTypes[type];
let subscription = subArr && subArr.includes(key);
if (!subscription || subscribed) {
result.push({
id: key,
name: I18n.t(`admin.wizard.custom_field.${type}.${key}`),
const generateContent = function (kategory, subscription) {
let unsubscribedCustomFields = requiringAdditionalSubscription(
subscription,
"custom_fields",
kategory
);
return wizardSchema.custom_field[kategory].reduce((result, item) => {
let disabled = unsubscribedCustomFields.includes(item);
result.push({
id: item,
name: I18n.t(`admin.wizard.custom_field.${kategory}.${item}`),
subscription: subscriptionLevel(item, "custom_fields", kategory),
disabled,
});
}
return result;
}, []);
};
@ -32,12 +32,6 @@ export default Component.extend({
postSerializers: ["post"],
groupSerializers: ["basic_group"],
categorySerializers: ["basic_category"],
klassContent: computed("subscribed", function () {
return generateContent(klasses, "klass", this.subscribed);
}),
typeContent: computed("subscribed", function () {
return generateContent(types, "type", this.subscribed);
}),
showInputs: or("field.new", "field.edit"),
classNames: ["custom-field-input"],
loading: or("saving", "destroying"),
@ -54,12 +48,26 @@ export default Component.extend({
const serializers = this.get(`${klass}Serializers`);
if (serializers) {
return generateContent(serializers, "serializers", this.subscribed);
} else {
return [];
return serializers.reduce((result, key) => {
result.push({
id: key,
name: I18n.t(`admin.wizard.custom_field.serializers.${key}`),
});
return result;
}, []);
}
},
@discourseComputed("subscription")
customFieldTypes(subscription) {
return generateContent("type", subscription);
},
@discourseComputed("subscription")
customFieldKlasses(subscription) {
return generateContent("klass", subscription);
},
@observes("field.klass")
clearSerializersWhenClassChanges() {
this.set("field.serializers", null);

Datei anzeigen

@ -4,18 +4,22 @@ import discourseComputed from "discourse-common/utils/decorators";
export default Component.extend({
classNameBindings: [":subscription-container", "subscribed"],
@discourseComputed('subscribed')
@discourseComputed("subscribed")
subscribedIcon(subscribed) {
return subscribed ? 'check' : 'dash';
return subscribed ? "check" : "dash";
},
@discourseComputed('subscribed')
@discourseComputed("subscribed")
subscribedLabel(subscribed) {
return `admin.wizard.subscription_container.${subscribed ? 'subscribed' : 'not_subscribed'}.label`;
return `admin.wizard.subscription_container.${
subscribed ? "subscribed" : "not_subscribed"
}.label`;
},
@discourseComputed('subscribed')
@discourseComputed("subscribed")
subscribedTitle(subscribed) {
return `admin.wizard.subscription_container.${subscribed ? 'subscribed' : 'not_subscribed'}.title`;
}
return `admin.wizard.subscription_container.${
subscribed ? "subscribed" : "not_subscribed"
}.title`;
},
});

Datei anzeigen

@ -1,5 +1,8 @@
import { default as discourseComputed } from "discourse-common/utils/decorators";
import wizardSchema from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard-schema";
import wizardSchema, {
requiringAdditionalSubscription,
subscriptionLevel,
} from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard-schema";
import { empty, equal, or } from "@ember/object/computed";
import { notificationLevels, selectKitContent } from "../lib/wizard";
import { computed } from "@ember/object";
@ -94,17 +97,21 @@ export default Component.extend(UndoChanges, {
return apis.find((a) => a.name === api).endpoints;
},
@discourseComputed("subscribed")
actionTypes(subscribed) {
@discourseComputed("subscription")
actionTypes(subscription) {
let unsubscribedActions = requiringAdditionalSubscription(
subscription,
"actions",
""
);
return Object.keys(wizardSchema.action.types).reduce((result, type) => {
let subscription = wizardSchema.action.subscriptionTypes.includes(type);
if (subscribed || !subscription) {
let disabled = unsubscribedActions.includes(type);
result.push({
id: type,
name: I18n.t(`admin.wizard.action.${type}.label`),
subscription,
subscription: subscriptionLevel(type, "actions", ""),
disabled,
});
}
return result;
}, []);
},

Datei anzeigen

@ -4,33 +4,39 @@ import { not, notEmpty } from "@ember/object/computed";
import I18n from "I18n";
export default Component.extend({
classNameBindings: [':wizard-notice', 'notice.type', 'dismissed', 'expired', 'resolved'],
classNameBindings: [
":wizard-notice",
"notice.type",
"dismissed",
"expired",
"resolved",
],
showFull: false,
resolved: notEmpty('notice.expired_at'),
dismissed: notEmpty('notice.dismissed_at'),
canDismiss: not('dismissed'),
resolved: notEmpty("notice.expired_at"),
dismissed: notEmpty("notice.dismissed_at"),
canDismiss: not("dismissed"),
@discourseComputed('notice.type')
@discourseComputed("notice.type")
title(type) {
return I18n.t(`admin.wizard.notice.title.${type}`);
},
@discourseComputed('notice.type')
@discourseComputed("notice.type")
icon(type) {
return {
plugin_status_warning: 'exclamation-circle',
plugin_status_connection_error: 'bolt',
subscription_messages_connection_error: 'bolt',
info: 'info-circle'
plugin_status_warning: "exclamation-circle",
plugin_status_connection_error: "bolt",
subscription_messages_connection_error: "bolt",
info: "info-circle",
}[type];
},
actions: {
dismiss() {
this.set('dismissing', true);
this.set("dismissing", true);
this.notice.dismiss().then(() => {
this.set('dismissing', false);
this.set("dismissing", false);
});
}
}
},
},
});

Datei anzeigen

@ -7,7 +7,8 @@ export default SingleSelectComponent.extend({
autoFilterable: false,
filterable: false,
showFullTitle: true,
headerComponent: "wizard-subscription-selector/wizard-subscription-selector-header",
headerComponent:
"wizard-subscription-selector/wizard-subscription-selector-header",
caretUpIcon: "caret-up",
caretDownIcon: "caret-down",
},

Datei anzeigen

@ -1,3 +1,20 @@
import SelectKitRowComponent from "select-kit/components/select-kit/select-kit-row";
import { default as discourseComputed } from "discourse-common/utils/decorators";
export default SelectKitRowComponent.extend();
export default SelectKitRowComponent.extend({
classNameBindings: ["isDisabled:disabled"],
@discourseComputed("item")
isDisabled() {
return this.item.disabled;
},
click(event) {
event.preventDefault();
event.stopPropagation();
if (!this.item.disabled) {
this.selectKit.select(this.rowValue, this.item);
}
return false;
},
});

Datei anzeigen

@ -25,7 +25,9 @@ export default Component.extend({
@discourseComputed("stateClass")
stateLabel(stateClass) {
return I18n.t(`admin.wizard.subscription.subscription.status.${stateClass}`);
return I18n.t(
`admin.wizard.subscription.subscription.status.${stateClass}`
);
},
actions: {

Datei anzeigen

@ -6,11 +6,11 @@ export default {
},
setupComponent() {
const controller = getOwner(this).lookup('controller:admin-dashboard');
const importantNotice = controller.get('customWizardImportantNotice');
const controller = getOwner(this).lookup("controller:admin-dashboard");
const importantNotice = controller.get("customWizardImportantNotice");
if (importantNotice) {
this.set('importantNotice', importantNotice);
}
this.set("importantNotice", importantNotice);
}
},
};

Datei anzeigen

@ -11,7 +11,7 @@ export default Controller.extend({
queryParams: ["refresh_list"],
loadingSubscriptions: false,
notAuthorized: not("api.authorized"),
endpointMethods: selectKitContent(["GET", "PUT", "POST", "PATCH", "DELETE"]),
endpointMethods: selectKitContent(["PUT", "POST", "PATCH", "DELETE"]),
showRemove: not("isNew"),
showRedirectUri: and("threeLeggedOauth", "api.name"),
responseIcon: null,

Datei anzeigen

@ -8,13 +8,13 @@ export default Controller.extend({
ajax(`/admin/wizards/notice/${this.id}`, {
type: "DELETE",
})
.then(result => {
.then((result) => {
if (result.success) {
const notices = this.notices;
notices.removeObject(notices.findBy('id', noticeId));
notices.removeObject(notices.findBy("id", noticeId));
}
})
.catch(popupAjaxError);
}
}
},
},
});

Datei anzeigen

@ -21,27 +21,37 @@ export default {
};
withPluginApi("0.8.36", (api) => {
api.modifyClass('route:admin-dashboard', {
api.modifyClass("route:admin-dashboard", {
afterModel() {
return CustomWizardNotice.list().then(result => {
return CustomWizardNotice.list().then((result) => {
if (result && result.length) {
this.set('notices', A(result.map(n => CustomWizardNotice.create(n))));
this.set(
"notices",
A(result.map((n) => CustomWizardNotice.create(n)))
);
}
});
},
setupController(controller) {
if (this.notices) {
let pluginStatusConnectionError = this.notices.filter(n => n.type === 'plugin_status_connection_error')[0];
let pluginStatusWarning = this.notices.filter(n => n.type === 'plugin_status_warning')[0];
let pluginStatusConnectionError = this.notices.filter(
(n) => n.type === "plugin_status_connection_error"
)[0];
let pluginStatusWarning = this.notices.filter(
(n) => n.type === "plugin_status_warning"
)[0];
if (pluginStatusConnectionError || pluginStatusWarning) {
controller.set('customWizardImportantNotice', pluginStatusConnectionError || pluginStatusWarning);
controller.set(
"customWizardImportantNotice",
pluginStatusConnectionError || pluginStatusWarning
);
}
}
this._super(...arguments);
}
},
});
});
},

Datei anzeigen

@ -193,32 +193,110 @@ const action = {
"members_visibility_level",
],
required: ["id", "type"],
subscriptionTypes: [
"send_message",
"add_to_group",
"create_category",
"create_group",
"send_to_api",
],
required: ["id", "type"],
proTypes: [
"send_message",
"add_to_group",
"create_category",
"create_group",
"send_to_api",
],
dependent: {},
objectArrays: {},
};
const custom_field = {
klass: ["topic", "post", "group", "category"],
type: ["string", "boolean", "integer", "json"],
};
const subscription_levels = {
standard: {
actions: ["send_message", "add_to_group", "watch_categories"],
custom_fields: {
klass: [],
type: ["json"],
},
},
business: {
actions: ["create_category", "create_group", "send_to_api"],
custom_fields: {
klass: ["group", "category"],
type: [],
},
},
};
const wizardSchema = {
wizard,
step,
field,
custom_field,
action,
subscription_levels,
};
export function requiringAdditionalSubscription(
currentSubscription,
category,
subCategory
) {
switch (category) {
case "actions":
switch (currentSubscription) {
case "business":
return [];
case "standard":
return subscription_levels["business"][category];
default:
return subscription_levels["standard"][category].concat(
subscription_levels["business"][category]
);
}
case "custom_fields":
switch (currentSubscription) {
case "business":
return [];
case "standard":
return subscription_levels["business"][category][subCategory];
default:
return subscription_levels["standard"][category][subCategory].concat(
subscription_levels["business"][category][subCategory]
);
}
default:
return [];
}
}
export function subscriptionLevel(type, category, subCategory) {
switch (category) {
case "actions":
if (subscription_levels["business"].actions.includes(type)) {
return "business";
} else {
if (subscription_levels["standard"].actions.includes(type)) {
return "standard";
} else {
return "";
}
}
case "custom_fields":
if (
subscription_levels["business"].custom_fields[subCategory].includes(
type
)
) {
return "business";
} else {
if (
subscription_levels["standard"].custom_fields[subCategory].includes(
type
)
) {
return "standard";
} else {
return "";
}
}
default:
return "";
}
}
export function buildFieldTypes(types) {
wizardSchema.field.types = types;
}

Datei anzeigen

@ -6,18 +6,20 @@ const CustomWizardNotice = EmberObject.extend();
CustomWizardNotice.reopen({
dismiss() {
return ajax(`/admin/wizards/notice/${this.id}`, { type: 'PUT' }).then(result => {
return ajax(`/admin/wizards/notice/${this.id}`, { type: "PUT" })
.then((result) => {
if (result.success) {
this.set('dismissed_at', result.dismissed_at);
}
}).catch(popupAjaxError);
this.set("dismissed_at", result.dismissed_at);
}
})
.catch(popupAjaxError);
},
});
CustomWizardNotice.reopenClass({
list() {
return ajax('/admin/wizards/notice').catch(popupAjaxError);
}
return ajax("/admin/wizards/notice").catch(popupAjaxError);
},
});
export default CustomWizardNotice;

Datei anzeigen

@ -10,10 +10,12 @@ export default DiscourseRoute.extend({
setupController(controller, model) {
const customFields = A(model.custom_fields || []);
const subscribed = model.subscribed;
const subscription = model.subscription;
controller.setProperties({
customFields,
subscribed,
subscription,
});
},
});

Datei anzeigen

@ -40,6 +40,7 @@ export default DiscourseRoute.extend({
currentAction: wizard.actions[0],
creating: model.create,
subscribed: parentModel.subscribed,
subscription: parentModel.subscription,
};
controller.setProperties(props);

Datei anzeigen

@ -4,16 +4,17 @@ import { A } from "@ember/array";
export default DiscourseRoute.extend({
model() {
return ajax('/admin/wizards');
return ajax("/admin/wizards");
},
setupController(controller, model) {
controller.set('notices', A(model.notices));
controller.set("notices", A(model.notices));
controller.set("api_section", model.api_section);
},
afterModel(model, transition) {
if (transition.targetName === "adminWizards.index") {
this.transitionTo("adminWizardsWizard");
}
}
},
});

Datei anzeigen

@ -33,7 +33,8 @@
field=field
removeField=(action "removeField")
saveField=(action "saveField")
subscribed=subscribed}}
subscribed=subscribed
subscription=subscription}}
{{/each}}
</tbody>
</table>

Datei anzeigen

@ -178,7 +178,8 @@
apis=apis
removeAction="removeAction"
wizardFields=wizardFields
subscribed=subscribed}}
subscribed=subscribed
subscription=subscription}}
{{/each}}
<div class="admin-wizard-buttons">

Datei anzeigen

@ -2,7 +2,7 @@
{{nav-item route="adminWizardsWizard" label="admin.wizard.nav_label"}}
{{nav-item route="adminWizardsCustomFields" label="admin.wizard.custom_field.nav_label"}}
{{nav-item route="adminWizardsSubmissions" label="admin.wizard.submissions.nav_label"}}
{{#if siteSettings.wizard_apis_enabled}}
{{#if api_section}}
{{nav-item route="adminWizardsApi" label="admin.wizard.api.nav_label"}}
{{/if}}
{{nav-item route="adminWizardsLogs" label="admin.wizard.log.nav_label"}}

Datei anzeigen

@ -2,14 +2,14 @@
<td>
{{wizard-subscription-selector
value=field.klass
content=klassContent
content=customFieldKlasses
none="admin.wizard.custom_field.klass.select"
onChange=(action (mut field.klass))}}
</td>
<td>
{{wizard-subscription-selector
value=field.type
content=typeContent
content=customFieldTypes
none="admin.wizard.custom_field.type.select"
onChange=(action (mut field.type))}}
</td>

Datei anzeigen

@ -33,7 +33,7 @@
</div>
<div class="notice-message">
{{{notice.message}}}
{{html-safe notice.message}}
</div>
{{#if importantOnDashboard}}

Datei anzeigen

@ -10,6 +10,8 @@
<div class="texts">
<span class="name">{{html-safe label}}</span>
{{#if item.subscription}}
<span class="subscription-label">{{i18n "admin.wizard.subscription.label"}}</span>
<span class="subscription-label">
{{item.subscription}}
</span>
{{/if}}
</div>

Datei anzeigen

@ -7,7 +7,7 @@ import { getOwner } from "discourse-common/lib/get-owner";
export function cook(text, options) {
if (!options) {
options = buildOptions({
getURL: getURL,
getURL,
siteSettings: getOwner(this).lookup("site-settings:main"),
});
}

Datei anzeigen

@ -27,12 +27,12 @@ function performSearch(
// need to be able to cancel this
oldSearch = $.ajax(getUrl("/u/search/users"), {
data: {
term: term,
term,
topic_id: topicId,
include_groups: includeGroups,
include_mentionable_groups: includeMentionableGroups,
include_messageable_groups: includeMessageableGroups,
group: group,
group,
topic_allowed_users: allowedUsers,
},
});

Datei anzeigen

@ -788,11 +788,6 @@
vertical-align: middle;
}
.subscription-label {
color: var(--tertiary);
font-size: 0.75em;
}
.admin-wizards-subscription {
.admin-wizard-controls {
h3,
@ -853,14 +848,21 @@
}
.wizard-subscription-selector.select-kit.single-select {
.select-kit-row .texts {
.select-kit-row {
.texts {
display: flex;
align-items: center;
}
&.disabled {
background: var(--primary-low);
}
}
.subscription-label {
margin-left: 0.75em;
padding-top: 0.25em;
color: var(--tertiary);
font-size: 0.75em;
}
}
@ -924,7 +926,7 @@
}
.d-icon {
margin-right: .4em;
margin-right: 0.4em;
}
.notice-header {
@ -935,9 +937,9 @@
border: 1px solid var(--primary);
display: inline-flex;
align-items: center;
padding: 0 .5em;
padding: 0 0.5em;
margin-right: 1em;
font-size: .9em;
font-size: 0.9em;
line-height: 25px;
min-height: 25px;
box-sizing: border-box;
@ -963,12 +965,12 @@
.notice-issued,
.notice-resolved {
margin-right: .3em;
margin-right: 0.3em;
}
.notice-message {
p {
margin: .5em 0;
margin: 0.5em 0;
}
p:last-of-type {

Datei anzeigen

@ -466,7 +466,8 @@ en:
subscription:
nav_label: Subscription
label: Subscription
label: In subscription
additional_label: "Add subscription"
title: Custom Wizard Subscription
authorize: Authorize
authorized: Authorized
@ -474,7 +475,7 @@ en:
not_subscribed: You're not currently subscribed
subscription:
title:
community: Community Subscription
standard: Standard Subscription
business: Business Subscription
status:
active: Active

Datei anzeigen

@ -15,9 +15,6 @@ plugins:
refresh: true
type: list
list_type: compact
wizard_apis_enabled:
client: true
default: false
wizard_important_notices_on_dashboard:
client: true
default: true

Datei anzeigen

@ -4,6 +4,8 @@ class CustomWizard::AdminController < ::Admin::AdminController
def index
render_json_dump(
#TODO replace with appropriate static?
api_section: ["business"].include?(CustomWizard::Subscription.type),
notices: ActiveModel::ArraySerializer.new(
CustomWizard::Notice.list,
each_serializer: CustomWizard::NoticeSerializer

Datei anzeigen

@ -3,7 +3,8 @@ class CustomWizard::AdminCustomFieldsController < CustomWizard::AdminController
def index
render_json_dump(
custom_fields: custom_field_list,
subscribed: CustomWizard::Subscription.subscribed?
subscribed: CustomWizard::Subscription.subscribed?,
subscription: CustomWizard::Subscription.type
)
end

Datei anzeigen

@ -11,7 +11,8 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController
field_types: CustomWizard::Field.types,
realtime_validations: CustomWizard::RealtimeValidation.types,
custom_fields: custom_field_list,
subscribed: CustomWizard::Subscription.subscribed?
subscribed: CustomWizard::Subscription.subscribed?,
subscription: CustomWizard::Subscription.type
)
end

Datei anzeigen

@ -74,7 +74,7 @@ class CustomWizard::Api::Endpoint
headers["Authorization"] = auth_string if auth_string
headers["Content-Type"] = content_type if content_type
connection = Excon.new(UrlHelper.encode_and_parse(endpoint.url), headers: headers)
connection = Excon.new(endpoint.url, headers: headers)
params = { method: endpoint.method }

Datei anzeigen

@ -17,9 +17,8 @@ class ::CustomWizard::CustomField
category: ["basic_category"],
post: ["post"]
}
SUBSCRIPTION_CLASSES ||= ['category', 'group']
TYPES ||= ["string", "boolean", "integer", "json"]
SUBSCRIPTION_TYPES ||= ["json"]
LIST_CACHE_KEY ||= 'custom_field_list'
def self.serializers
@ -85,7 +84,7 @@ class ::CustomWizard::CustomField
next
end
if attr == 'klass' && SUBSCRIPTION_CLASSES.include?(value) && !@subscription.subscribed?
if attr == 'klass' && @subscription.requires_additional_subscription("custom_fields", "klass").include?(value)
add_error(I18n.t("wizard.custom_field.error.subscription_type", type: value))
end
@ -100,7 +99,7 @@ class ::CustomWizard::CustomField
add_error(I18n.t("#{i18n_key}.unsupported_type", type: value))
end
if attr == 'type' && SUBSCRIPTION_TYPES.include?(value) && !@subscription.subscribed?
if attr == 'type' && @subscription.requires_additional_subscription("custom_fields", "type").include?(value)
add_error(I18n.t("wizard.custom_field.error.subscription_type", type: value))
end

Datei anzeigen

@ -6,6 +6,23 @@ class CustomWizard::Subscription
attr_accessor :authentication,
:subscription
SUBSCRIPTION_LEVELS = {
standard: {
actions: ["send_message", "add_to_group", "watch_categories"],
custom_fields: {
klass: [],
type: ["json"],
},
},
business: {
actions: ["create_category", "create_group", "send_to_api"],
custom_fields: {
klass: ["group", "category"],
type: [],
},
},
}
def initialize
@authentication = CustomWizard::Subscription::Authentication.new(get_authentication)
@subscription = CustomWizard::Subscription::Subscription.new(get_subscription)
@ -27,6 +44,10 @@ class CustomWizard::Subscription
"stripe"
end
def type
@subscription.type
end
def client_name
"custom-wizard"
end
@ -35,6 +56,31 @@ class CustomWizard::Subscription
"discourse-subscription-server:user_subscription"
end
def requires_additional_subscription(kategory, sub_kategory)
case kategory
when "actions"
case self.type
when "business"
[]
when "standard"
SUBSCRIPTION_LEVELS[:business][kategory.to_sym]
else
SUBSCRIPTION_LEVELS[:standard][kategory.to_sym] + SUBSCRIPTION_LEVELS[:business][kategory.to_sym]
end
when "custom_fields"
case self.type
when "business"
[]
when "standard"
SUBSCRIPTION_LEVELS[:business][kategory.to_sym][sub_kategory.to_sym]
else
SUBSCRIPTION_LEVELS[:standard][kategory.to_sym][sub_kategory.to_sym] + SUBSCRIPTION_LEVELS[:business][kategory.to_sym][sub_kategory.to_sym]
end
else
[]
end
end
def update
if @authentication.active?
response = Excon.get(
@ -119,6 +165,14 @@ class CustomWizard::Subscription
self.new.subscribed?
end
def self.type
self.new.type
end
def self.requires_additional_subscription(kategory, sub_kategory)
self.new.requires_additional_subscription(kategory, sub_kategory)
end
def self.authorized?
self.new.authorized?
end

Datei anzeigen

@ -13,7 +13,7 @@ class CustomWizard::Subscription::Subscription
end
def types
%w(community business)
%w(none standard business)
end
def active?

Datei anzeigen

@ -13,6 +13,9 @@ describe CustomWizard::Action do
let(:add_to_group) { get_wizard_fixture("actions/add_to_group") }
let(:send_message) { get_wizard_fixture("actions/send_message") }
let(:send_message_multi) { get_wizard_fixture("actions/send_message_multi") }
let(:api_test_endpoint) { get_wizard_fixture("endpoints/test_endpoint") }
let(:api_test_endpoint_body) { get_wizard_fixture("endpoints/test_endpoint_body") }
let(:api_test_no_authorization) { get_wizard_fixture("api/no_authorization") }
def update_template(template)
CustomWizard::Template.save(template, skip_jobs: true)
@ -176,7 +179,7 @@ describe CustomWizard::Action do
context "subscription actions" do
before do
enable_subscription
enable_subscription("standard")
end
it '#send_message' do
@ -265,5 +268,51 @@ describe CustomWizard::Action do
expect(group.users.first.username).to eq('angus')
end
it '#send_to_api successful' do
stub_request(:put, "https://myexternalapi.com/update").
with(
body: "some_body",
headers: {
'Host' => 'myexternalapi.com'
}).
to_return(status: 200, body: "success", headers: {})
new_api = CustomWizard::Api.new("my_api")
CustomWizard::Api.set("my_api", title: "Mocked external api")
CustomWizard::Api::Authorization.set("my_api", api_test_no_authorization)
CustomWizard::Api::Endpoint.new("my_api")
CustomWizard::Api::Endpoint.set("my_api", api_test_endpoint)
endpoint_id = CustomWizard::Api::Endpoint.list("my_api").first.id
result = CustomWizard::Api::Endpoint.request("my_api", endpoint_id, "some_body")
log_entry = CustomWizard::Api::LogEntry.list("my_api").first
expect(result).to eq('success')
expect(log_entry.status).to eq('SUCCESS')
end
it '#send_to_api failure' do
stub_request(:put, "https://myexternalapi.com/update").
with(
body: "some_body",
headers: {
'Host' => 'myexternalapi.com'
}).
to_return(status: 500, body: "failure", headers: {})
new_api = CustomWizard::Api.new("my_api")
CustomWizard::Api.set("my_api", title: "Mocked external api")
CustomWizard::Api::Authorization.set("my_api", api_test_no_authorization)
CustomWizard::Api::Endpoint.new("my_api")
CustomWizard::Api::Endpoint.set("my_api", api_test_endpoint)
endpoint_id = CustomWizard::Api::Endpoint.list("my_api").first.id
result = CustomWizard::Api::Endpoint.request("my_api", endpoint_id, "some_body")
log_entry = CustomWizard::Api::LogEntry.list("my_api").first
expect(result).to eq({ error: "API request failed" })
expect(log_entry.status).to eq('FAIL')
end
end
end

Datei anzeigen

@ -176,7 +176,7 @@ describe CustomWizard::Builder do
context "restart is enabled" do
before do
enable_subscription
enable_subscription("standard")
@template[:restart_on_revisit] = true
CustomWizard::Template.save(@template.as_json)
end
@ -205,7 +205,7 @@ describe CustomWizard::Builder do
context 'with required data' do
before do
enable_subscription
enable_subscription("standard")
@template[:steps][0][:required_data] = required_data_json['required_data']
@template[:steps][0][:required_data_message] = required_data_json['required_data_message']
CustomWizard::Template.save(@template.as_json)
@ -241,7 +241,7 @@ describe CustomWizard::Builder do
context "with permitted params" do
before do
enable_subscription
enable_subscription("standard")
@template[:steps][0][:permitted_params] = permitted_param_json['permitted_params']
CustomWizard::Template.save(@template.as_json)
end
@ -256,7 +256,7 @@ describe CustomWizard::Builder do
context "with condition" do
before do
enable_subscription
enable_subscription("standard")
@template[:steps][0][:condition] = user_condition_json['condition']
CustomWizard::Template.save(@template.as_json)
end
@ -295,7 +295,7 @@ describe CustomWizard::Builder do
context "with condition" do
before do
enable_subscription
enable_subscription("standard")
@template[:steps][0][:fields][0][:condition] = user_condition_json['condition']
CustomWizard::Template.save(@template.as_json)
end
@ -327,7 +327,7 @@ describe CustomWizard::Builder do
context 'save submissions disabled' do
before do
enable_subscription
enable_subscription("standard")
@template[:save_submissions] = false
CustomWizard::Template.save(@template.as_json)
@wizard = CustomWizard::Builder.new(@template[:id], user).build

Datei anzeigen

@ -217,7 +217,7 @@ describe CustomWizard::CustomField do
context "with a subscription" do
before do
enable_subscription
enable_subscription("business")
end
it "saves subscription field types" do

Datei anzeigen

@ -359,7 +359,7 @@ describe CustomWizard::Mapper do
context "with a subscription" do
before do
enable_subscription
enable_subscription("standard")
end
it "treats replaced values as string literals" do

Datei anzeigen

@ -75,7 +75,7 @@ describe CustomWizard::TemplateValidator do
context "with subscription" do
before do
enable_subscription
enable_subscription("standard")
end
it "validates wizard attributes" do

Datei anzeigen

@ -74,7 +74,7 @@ describe "custom field extensions" do
context "subscription custom fields" do
before do
enable_subscription
enable_subscription("business")
subscription_custom_field_json['custom_fields'].each do |field_json|
custom_field = CustomWizard::CustomField.new(nil, field_json)

3
spec/fixtures/api/no_authorization.json gevendort Normale Datei
Datei anzeigen

@ -0,0 +1,3 @@
{
"auth_type": "none"
}

5
spec/fixtures/endpoints/test_endpoint.json gevendort Normale Datei
Datei anzeigen

@ -0,0 +1,5 @@
{
"method": "PUT",
"url": "https://myexternalapi.com/update",
"success_codes": [200]
}

Datei anzeigen

@ -0,0 +1,3 @@
{
"data": "some_data"
}

Datei anzeigen

@ -15,6 +15,7 @@ require 'oj'
Oj.default_options = Oj.default_options.merge(cache_str: -1)
require 'rails_helper'
require 'webmock/rspec'
def get_wizard_fixture(path)
JSON.parse(
@ -28,8 +29,10 @@ def authenticate_subscription
CustomWizard::Subscription::Authentication.any_instance.stubs(:active?).returns(true)
end
def enable_subscription
def enable_subscription(type)
# CustomWizard::Subscription.new
CustomWizard::Subscription.any_instance.stubs(:subscribed?).returns(true)
CustomWizard::Subscription.any_instance.stubs(:type).returns(type)
end
def disable_subscription

Datei anzeigen

@ -40,8 +40,7 @@ describe "custom field extensions" do
context "with a subscription" do
before do
enable_subscription
enable_subscription("business")
subscription_custom_field_json['custom_fields'].each do |field_json|
custom_field = CustomWizard::CustomField.new(nil, field_json)
custom_field.save

Datei anzeigen

@ -121,7 +121,7 @@ describe CustomWizard::StepsController do
context "subscription" do
before do
enable_subscription
enable_subscription("standard")
end
it "raises an error when user cant see the step due to conditions" do

Datei anzeigen

@ -4,11 +4,11 @@ require_relative '../../../plugin_helper'
describe CustomWizard::Subscription::SubscriptionSerializer do
it 'should return subscription attributes' do
sub = CustomWizard::Subscription::Subscription.new(OpenStruct.new(type: 'community', updated_at: Time.now))
sub = CustomWizard::Subscription::Subscription.new(OpenStruct.new(type: 'standard', updated_at: Time.now))
serialized = described_class.new(sub, root: false).as_json
expect(serialized[:active]).to eq(true)
expect(serialized[:type]).to eq('community')
expect(serialized[:type]).to eq('standard')
expect(serialized[:updated_at]).to eq(sub.updated_at)
end
end

Datei anzeigen

@ -34,7 +34,7 @@ describe CustomWizard::StepSerializer do
context 'with required data' do
before do
enable_subscription
enable_subscription("standard")
wizard_template['steps'][0]['required_data'] = required_data_json['required_data']
wizard_template['steps'][0]['required_data_message'] = required_data_json['required_data_message']
CustomWizard::Template.save(wizard_template)