1
0
Fork 0

Improve custom wizard serialization and add spec

Dieser Commit ist enthalten in:
Angus McLeod 2019-12-12 15:43:11 +11:00
Ursprung c8ce5e957e
Commit 4d1ee9007b
12 geänderte Dateien mit 149 neuen und 137 gelöschten Zeilen

Datei anzeigen

@ -50,7 +50,7 @@ export function findCustomWizard(wizardId, params = {}) {
} }
return ajax({ url, cache: false, dataType: 'json' }).then(result => { return ajax({ url, cache: false, dataType: 'json' }).then(result => {
const wizard = result.wizard; const wizard = result.custom_wizard;
if (!wizard) return null; if (!wizard) return null;
if (!wizard.completed) { if (!wizard.completed) {

Datei anzeigen

@ -26,7 +26,7 @@ class CustomWizard::WizardController < ::ApplicationController
if builder.wizard.present? if builder.wizard.present?
wizard = builder.build(builder_opts, params) wizard = builder.build(builder_opts, params)
render_serialized(wizard, WizardSerializer) render_serialized(wizard, ::CustomWizardSerializer)
else else
render json: { error: I18n.t('wizard.none') } render json: { error: I18n.t('wizard.none') }
end end

Datei anzeigen

@ -246,6 +246,12 @@ class CustomWizard::Builder
params[:property] = field_template['property'] params[:property] = field_template['property']
end end
if field_template['type'] === 'category' ||
(field_template['type'] === 'dropdown' &&
field_template['choices_preset'] === 'categories')
@wizard.needs_categories = true
end
field = step.add_field(params) field = step.add_field(params)
if field_template['type'] === 'dropdown' if field_template['type'] === 'dropdown'

Datei anzeigen

@ -6,6 +6,7 @@ require_dependency 'wizard/builder'
UserHistory.actions[:custom_wizard_step] = 1000 UserHistory.actions[:custom_wizard_step] = 1000
class CustomWizard::Wizard class CustomWizard::Wizard
include ActiveModel::SerializerSupport
attr_reader :steps, :user attr_reader :steps, :user
attr_accessor :id, attr_accessor :id,
@ -19,12 +20,15 @@ class CustomWizard::Wizard
:after_signup, :after_signup,
:required, :required,
:prompt_completion, :prompt_completion,
:restart_on_revisit :restart_on_revisit,
:needs_categories
def initialize(user=nil, attrs = {}) def initialize(user=nil, attrs = {})
@steps = [] @steps = []
@user = user @user = user
@first_step = nil @first_step = nil
@required = false
@needs_categories = false
attrs.each do |key, value| attrs.each do |key, value|
setter = "#{key}=" setter = "#{key}="
@ -133,6 +137,10 @@ class CustomWizard::Wizard
) )
end end
def categories
@categories ||= ::Site.new(Guardian.new(@user)).categories
end
def self.after_signup def self.after_signup
rows = PluginStoreRow.where(plugin_name: 'custom_wizard') rows = PluginStoreRow.where(plugin_name: 'custom_wizard')
wizards = [*rows].select { |r| r.value['after_signup'] } wizards = [*rows].select { |r| r.value['after_signup'] }

Datei anzeigen

@ -63,16 +63,16 @@ after_initialize do
'../lib/wizard/choice.rb', '../lib/wizard/choice.rb',
'../lib/wizard/field.rb', '../lib/wizard/field.rb',
'../lib/wizard/step.rb', '../lib/wizard/step.rb',
'../serializers/custom_wizard/api_serializer.rb',
'../serializers/custom_wizard/basic_api_serializer.rb',
'../serializers/custom_wizard/api/authorization_serializer.rb', '../serializers/custom_wizard/api/authorization_serializer.rb',
'../serializers/custom_wizard/api/basic_endpoint_serializer.rb', '../serializers/custom_wizard/api/basic_endpoint_serializer.rb',
'../serializers/custom_wizard/api/endpoint_serializer.rb', '../serializers/custom_wizard/api/endpoint_serializer.rb',
'../serializers/custom_wizard/api/log_serializer.rb', '../serializers/custom_wizard/api/log_serializer.rb',
'../serializers/site_serializer.rb', '../serializers/custom_wizard/api_serializer.rb',
'../serializers/wizard_serializer.rb', '../serializers/custom_wizard/basic_api_serializer.rb',
'../serializers/wizard_step_serializer.rb', '../serializers/custom_wizard/wizard_field_serializer.rb',
'../serializers/wizard_field_serializer.rb' '../serializers/custom_wizard/wizard_step_serializer.rb',
'../serializers/custom_wizard/wizard_serializer.rb',
'../serializers/site_serializer.rb'
].each do |path| ].each do |path|
load File.expand_path(path, __FILE__) load File.expand_path(path, __FILE__)
end end

Datei anzeigen

@ -1,11 +1,14 @@
module CustomWizardFieldSerializerExtension # frozen_string_literal: true
extend ActiveSupport::Concern
def self.prepended(klass) class CustomWizardFieldSerializer < ::WizardFieldSerializer
klass.class_eval do
attributes :dropdown_none, :image, :file_types, :limit, :property attributes :dropdown_none,
end :image,
end :file_types,
:limit,
:property
has_many :fields, serializer: CustomWizardFieldSerializer, embed: :objects
def label def label
return object.label if object.label.present? return object.label if object.label.present?
@ -45,7 +48,3 @@ module CustomWizardFieldSerializerExtension
object.property object.property
end end
end end
class WizardFieldSerializer
prepend CustomWizardFieldSerializerExtension if SiteSetting.custom_wizard_enabled
end

Datei anzeigen

@ -0,0 +1,51 @@
# frozen_string_literal: true
class CustomWizardSerializer < ::WizardSerializer
attributes :id,
:name,
:background,
:completed,
:required,
:min_trust,
:permitted,
:uncategorized_category_id
has_one :user, serializer: ::BasicUserSerializer, embed: :objects
has_many :steps, serializer: ::CustomWizardStepSerializer, embed: :objects
has_many :categories, serializer: ::BasicCategorySerializer, embed: :objects
def completed
object.completed?
end
def include_completed?
object.completed? &&
(!object.respond_to?(:multiple_submissions) || !object.multiple_submissions) &&
!scope.is_admin?
end
def permitted
object.permitted?
end
def include_start?
object.start && include_steps?
end
def include_steps?
!include_completed?
end
def include_categories?
object.needs_categories
end
def uncategorized_category_id
SiteSetting.uncategorized_category_id
end
def include_uncategorized_category_id?
object.needs_categories
end
end

Datei anzeigen

@ -1,11 +1,8 @@
module CustomWizardStepSerializerExtension # frozen_string_literal: true
extend ActiveSupport::Concern
class ::CustomWizardStepSerializer < ::WizardStepSerializer
def self.prepended(klass)
klass.class_eval do
attributes :permitted, :permitted_message attributes :permitted, :permitted_message
end
end
def title def title
return PrettyText.cook(object.title) if object.title return PrettyText.cook(object.title) if object.title
@ -25,7 +22,3 @@ module CustomWizardStepSerializerExtension
object.permitted_message object.permitted_message
end end
end end
class WizardStepSerializer
prepend CustomWizardStepSerializerExtension if SiteSetting.custom_wizard_enabled
end

Datei anzeigen

@ -1,4 +1,5 @@
## TODO limit this to the first admin ## TODO limit this to the first admin
module CustomWizardSiteSerializerExtension module CustomWizardSiteSerializerExtension
extend ActiveSupport::Concern extend ActiveSupport::Concern
@ -23,6 +24,6 @@ module CustomWizardSiteSerializerExtension
end end
end end
class SiteSerializer class ::SiteSerializer
prepend CustomWizardSiteSerializerExtension if SiteSetting.custom_wizard_enabled prepend CustomWizardSiteSerializerExtension if SiteSetting.custom_wizard_enabled
end end

Datei anzeigen

@ -1,105 +0,0 @@
module CustomWizardSerializerExtension
extend ActiveSupport::Concern
def self.prepended(klass)
klass.class_eval do
attributes :id,
:name,
:background,
:completed,
:required,
:min_trust,
:permitted,
:user,
:categories,
:uncategorized_category_id
end
end
def id
object.id
end
def include_id?
object.respond_to?(:id)
end
def name
object.name
end
def include_name?
object.respond_to?(:name)
end
def background
object.background
end
def include_background?
object.respond_to?(:background)
end
def completed
object.completed?
end
def include_completed?
object.completed? &&
(!object.respond_to?(:multiple_submissions) || !object.multiple_submissions) &&
!scope.is_admin?
end
def min_trust
object.min_trust
end
def include_min_trust?
object.respond_to?(:min_trust)
end
def permitted
object.permitted?
end
def include_permitted?
object.respond_to?(:permitted?)
end
def include_start?
object.start && include_steps?
end
def include_steps?
!include_completed?
end
def required
object.required
end
def include_required?
object.respond_to?(:required)
end
def user
object.user
end
def categories
begin
site = ::Site.new(scope)
::ActiveModel::ArraySerializer.new(site.categories, each_serializer: BasicCategorySerializer)
rescue => e
[]
end
end
def uncategorized_category_id
SiteSetting.uncategorized_category_id
end
end
class WizardSerializer
prepend CustomWizardSerializerExtension if SiteSetting.custom_wizard_enabled
end

Datei anzeigen

@ -5,6 +5,7 @@
"save_submissions": true, "save_submissions": true,
"multiple_submissions": true, "multiple_submissions": true,
"after_signup": true, "after_signup": true,
"min_trust": 1,
"theme_id": 4, "theme_id": 4,
"steps": [ "steps": [
{ {

Datei anzeigen

@ -0,0 +1,58 @@
# frozen_string_literal: true
require 'rails_helper'
describe CustomWizardSerializer do
fab!(:user) { Fabricate(:user) }
fab!(:category) { Fabricate(:category) }
let!(:template) do
JSON.parse(File.open(
"#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
).read)
end
let(:dropdown_categories_field) {{"id": "dropdown_categories","type": "dropdown","label": "Dropdown Categories","choices_type": "preset","choices_preset": "categories"}}
let(:category_field) {{"id": "category","type": "category","limit": "1","label": "Category"}}
def build_wizard(t = template, u = user, build_opts = {}, params = {})
CustomWizard::Wizard.add_wizard(t)
CustomWizard::Builder.new(u, 'welcome').build(build_opts, params)
end
it 'should return the wizard attributes' do
json = CustomWizardSerializer.new(build_wizard, scope: Guardian.new(user)).as_json
expect(json[:custom_wizard][:id]).to eq("welcome")
expect(json[:custom_wizard][:name]).to eq("Welcome")
expect(json[:custom_wizard][:background]).to eq("#006da3")
expect(json[:custom_wizard][:required]).to eq(false)
expect(json[:custom_wizard][:min_trust]).to eq(1)
end
it "should return the wizard user attributes" do
json = CustomWizardSerializer.new(build_wizard, scope: Guardian.new(user)).as_json
expect(json[:custom_wizard][:permitted]).to eq(true)
expect(json[:custom_wizard][:user]).to eq(BasicUserSerializer.new(user, root: false).as_json)
end
it "should not return category attributes if there are no category fields" do
json = CustomWizardSerializer.new(build_wizard, scope: Guardian.new(user)).as_json
expect(json[:custom_wizard][:categories].present?).to eq(false)
expect(json[:custom_wizard][:uncategorized_category_id].present?).to eq(false)
end
it "should return category attributes if there are dropdown category fields" do
template['steps'][0]['fields'][0] = dropdown_categories_field
json = CustomWizardSerializer.new(build_wizard(template), scope: Guardian.new(user)).as_json
expect(json[:custom_wizard][:categories].present?).to eq(true)
expect(json[:custom_wizard][:uncategorized_category_id].present?).to eq(true)
end
it "should return category attributes if there is a category selector field" do
template['steps'][0]['fields'][0] = category_field
wizard = build_wizard(template)
json = CustomWizardSerializer.new(wizard, scope: Guardian.new(user)).as_json
expect(json[:custom_wizard][:categories].present?).to eq(true)
expect(json[:custom_wizard][:uncategorized_category_id].present?).to eq(true)
end
end