af3e61fe75
* Add custom field improvements This PR does a few things to improve our support of custom fields 1. Adds custom fields added by other plugins to the list in admin/wizards/custom-fields and the custom field list in the mapper selector 2. Adds support for json custom fields in the wizard actions * Make eslint happy * Make prettier happy * Make rubocop happy * Make ember template lint happy * Don't assume we have the context in the selector * Ensure custom fields don't require optional attributes (with tests)
243 Zeilen
8,2 KiB
Ruby
243 Zeilen
8,2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require_relative '../../plugin_helper'
|
|
|
|
describe CustomWizard::CustomField do
|
|
|
|
let(:custom_field_json) {
|
|
JSON.parse(File.open(
|
|
"#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/custom_field/custom_fields.json"
|
|
).read)
|
|
}
|
|
|
|
before do
|
|
CustomWizard::CustomField.invalidate_cache
|
|
end
|
|
|
|
it "saves custom field records" do
|
|
custom_field_json['custom_fields'].each do |field_json|
|
|
custom_field = CustomWizard::CustomField.new(nil, field_json)
|
|
expect(custom_field.save).to eq(true)
|
|
expect(
|
|
PluginStoreRow.where("
|
|
plugin_name = '#{CustomWizard::CustomField::NAMESPACE}' AND
|
|
key = '#{custom_field.name}' AND
|
|
value::jsonb = '#{field_json.except('name').to_json}'::jsonb
|
|
",).exists?
|
|
).to eq(true)
|
|
end
|
|
end
|
|
|
|
it "updates existing custom field records" do
|
|
custom_field_json['custom_fields'].each do |field_json|
|
|
CustomWizard::CustomField.new(nil, field_json).save
|
|
end
|
|
|
|
updated_field_json = custom_field_json['custom_fields'][0]
|
|
updated_field_json['serializers'] = ["topic_view"]
|
|
existing_field = CustomWizard::CustomField.find_by_name(updated_field_json["name"])
|
|
updated_field = CustomWizard::CustomField.new(existing_field.id, updated_field_json)
|
|
|
|
expect(updated_field.save).to eq(true)
|
|
expect(
|
|
PluginStoreRow.where("
|
|
plugin_name = '#{CustomWizard::CustomField::NAMESPACE}' AND
|
|
key = '#{updated_field.name}' AND
|
|
value::jsonb = '#{updated_field_json.except('name').to_json}'::jsonb
|
|
",).exists?
|
|
).to eq(true)
|
|
end
|
|
|
|
context "validation" do
|
|
it "does not save without required attributes" do
|
|
invalid_field_json = custom_field_json['custom_fields'].first
|
|
invalid_field_json['klass'] = nil
|
|
|
|
custom_field = CustomWizard::CustomField.new(nil, invalid_field_json)
|
|
expect(custom_field.save).to eq(false)
|
|
expect(custom_field.valid?).to eq(false)
|
|
expect(custom_field.errors.full_messages.first).to eq(
|
|
I18n.t("wizard.custom_field.error.required_attribute", attr: "klass")
|
|
)
|
|
expect(
|
|
PluginStoreRow.where(
|
|
plugin_name: CustomWizard::CustomField::NAMESPACE,
|
|
key: custom_field.name
|
|
).exists?
|
|
).to eq(false)
|
|
end
|
|
|
|
it "does save without optional attributes" do
|
|
field_json = custom_field_json['custom_fields'].first
|
|
field_json['serializers'] = nil
|
|
|
|
custom_field = CustomWizard::CustomField.new(nil, field_json)
|
|
expect(custom_field.save).to eq(true)
|
|
expect(custom_field.valid?).to eq(true)
|
|
expect(
|
|
PluginStoreRow.where("
|
|
plugin_name = '#{CustomWizard::CustomField::NAMESPACE}' AND
|
|
key = '#{custom_field.name}' AND
|
|
value::jsonb = '#{field_json.except('name').to_json}'::jsonb
|
|
",).exists?
|
|
).to eq(true)
|
|
end
|
|
|
|
it "does not save with an unsupported class" do
|
|
invalid_field_json = custom_field_json['custom_fields'].first
|
|
invalid_field_json['klass'] = 'user'
|
|
|
|
custom_field = CustomWizard::CustomField.new(nil, invalid_field_json)
|
|
|
|
expect(custom_field.save).to eq(false)
|
|
expect(custom_field.valid?).to eq(false)
|
|
expect(custom_field.errors.full_messages.first).to eq(
|
|
I18n.t("wizard.custom_field.error.unsupported_class", class: "user")
|
|
)
|
|
expect(
|
|
PluginStoreRow.where(
|
|
plugin_name: CustomWizard::CustomField::NAMESPACE,
|
|
key: custom_field.name
|
|
).exists?
|
|
).to eq(false)
|
|
end
|
|
|
|
it "does not save with an unsupported serializer" do
|
|
invalid_field_json = custom_field_json['custom_fields'].first
|
|
invalid_field_json['klass'] = 'category'
|
|
invalid_field_json['serializers'] = ['category', 'site_category']
|
|
|
|
custom_field = CustomWizard::CustomField.new(nil, invalid_field_json)
|
|
|
|
expect(custom_field.save).to eq(false)
|
|
expect(custom_field.valid?).to eq(false)
|
|
expect(custom_field.errors.full_messages.first).to eq(
|
|
I18n.t("wizard.custom_field.error.unsupported_serializers",
|
|
class: "category",
|
|
serializers: "category, site_category"
|
|
)
|
|
)
|
|
expect(
|
|
PluginStoreRow.where(
|
|
plugin_name: CustomWizard::CustomField::NAMESPACE,
|
|
key: custom_field.name
|
|
).exists?
|
|
).to eq(false)
|
|
end
|
|
|
|
it "does not save with an unsupported type" do
|
|
invalid_field_json = custom_field_json['custom_fields'].first
|
|
invalid_field_json['type'] = 'bigint'
|
|
|
|
custom_field = CustomWizard::CustomField.new(nil, invalid_field_json)
|
|
|
|
expect(custom_field.save).to eq(false)
|
|
expect(custom_field.valid?).to eq(false)
|
|
expect(custom_field.errors.full_messages.first).to eq(
|
|
I18n.t("wizard.custom_field.error.unsupported_type", type: "bigint")
|
|
)
|
|
expect(
|
|
PluginStoreRow.where(
|
|
plugin_name: CustomWizard::CustomField::NAMESPACE,
|
|
key: custom_field.name
|
|
).exists?
|
|
).to eq(false)
|
|
end
|
|
|
|
it "does not save with a short field name" do
|
|
invalid_field_json = custom_field_json['custom_fields'].first
|
|
invalid_field_json['name'] = 'cf'
|
|
|
|
custom_field = CustomWizard::CustomField.new(nil, invalid_field_json)
|
|
|
|
expect(custom_field.save).to eq(false)
|
|
expect(custom_field.valid?).to eq(false)
|
|
expect(custom_field.errors.full_messages.first).to eq(
|
|
I18n.t("wizard.custom_field.error.name_too_short", name: "cf")
|
|
)
|
|
expect(
|
|
PluginStoreRow.where(
|
|
plugin_name: CustomWizard::CustomField::NAMESPACE,
|
|
key: custom_field.name
|
|
).exists?
|
|
).to eq(false)
|
|
end
|
|
|
|
it "does not save with an existing name if new" do
|
|
custom_field_json['custom_fields'].each do |field_json|
|
|
CustomWizard::CustomField.new(nil, field_json).save
|
|
end
|
|
|
|
first_field_json = custom_field_json['custom_fields'][0]
|
|
custom_field = CustomWizard::CustomField.new(nil, first_field_json)
|
|
|
|
expect(custom_field.save).to eq(false)
|
|
expect(custom_field.valid?).to eq(false)
|
|
expect(custom_field.errors.full_messages.first).to eq(
|
|
I18n.t("wizard.custom_field.error.name_already_taken", name: "topic_field_1")
|
|
)
|
|
end
|
|
|
|
it "does not save with an invalid name" do
|
|
invalid_field_json = custom_field_json['custom_fields'].first
|
|
invalid_field_json['name'] = ["invalid_name"]
|
|
|
|
custom_field = CustomWizard::CustomField.new(nil, invalid_field_json)
|
|
|
|
expect(custom_field.save).to eq(false)
|
|
expect(custom_field.valid?).to eq(false)
|
|
expect(custom_field.errors.full_messages.first).to eq(
|
|
I18n.t("wizard.custom_field.error.name_invalid", name: ["invalid_name"])
|
|
)
|
|
expect(
|
|
PluginStoreRow.where(
|
|
plugin_name: CustomWizard::CustomField::NAMESPACE,
|
|
key: custom_field.name
|
|
).exists?
|
|
).to eq(false)
|
|
end
|
|
end
|
|
|
|
context "lists" do
|
|
before do
|
|
custom_field_json['custom_fields'].each do |field_json|
|
|
CustomWizard::CustomField.new(nil, field_json).save
|
|
end
|
|
end
|
|
|
|
it "lists saved custom field records" do
|
|
expect(CustomWizard::CustomField.list.length).to eq(4)
|
|
end
|
|
|
|
it "lists saved custom field records by attribute value" do
|
|
expect(CustomWizard::CustomField.list_by(:klass, 'topic').length).to eq(1)
|
|
end
|
|
|
|
it "lists saved custom field records by optional values" do
|
|
field_json = custom_field_json['custom_fields'].first
|
|
field_json['serializers'] = nil
|
|
|
|
custom_field = CustomWizard::CustomField.new(nil, field_json)
|
|
expect(CustomWizard::CustomField.list_by(:serializers, ['post']).length).to eq(0)
|
|
end
|
|
|
|
it "lists custom field records added by other plugins " do
|
|
expect(CustomWizard::CustomField.external_list.length).to eq(11)
|
|
end
|
|
|
|
it "lists all custom field records" do
|
|
expect(CustomWizard::CustomField.full_list.length).to eq(15)
|
|
end
|
|
end
|
|
|
|
it "is enabled if there are custom fields" do
|
|
custom_field_json['custom_fields'].each do |field_json|
|
|
CustomWizard::CustomField.new(nil, field_json).save
|
|
end
|
|
expect(CustomWizard::CustomField.enabled?).to eq(true)
|
|
end
|
|
|
|
it "is not enabled if there are no custom fields" do
|
|
expect(CustomWizard::CustomField.enabled?).to eq(false)
|
|
end
|
|
end
|