1
0
Fork 0

Merge branch 'main' into admin-acceptance-tests

Dieser Commit ist enthalten in:
jumagura 2023-05-26 00:53:58 -04:00
Commit 2cb876ac69
10 geänderte Dateien mit 199 neuen und 137 gelöschten Zeilen

Datei anzeigen

@ -8,7 +8,7 @@ class CustomWizard::AdminController < ::Admin::AdminController
subscribed: subcription.subscribed?, subscribed: subcription.subscribed?,
subscription_type: subcription.type, subscription_type: subcription.type,
subscription_attributes: CustomWizard::Subscription.attributes, subscription_attributes: CustomWizard::Subscription.attributes,
subscription_client_installed: subcription.client_installed? subscription_client_installed: CustomWizard::Subscription.client_installed?
) )
end end

Datei anzeigen

@ -69,7 +69,10 @@ export default {
}, },
_wizardInsertText(text, options) { _wizardInsertText(text, options) {
if (this.session.wizardEventFieldId === this.fieldId) { if (
this.session.wizardEventFieldId === this.fieldId &&
this.element
) {
this.insertText(text, options); this.insertText(text, options);
} }
}, },

Datei anzeigen

@ -65,18 +65,18 @@ class CustomWizard::Api::LogEntry
data = ::JSON.parse(record['value']) data = ::JSON.parse(record['value'])
data[:log_id] = record['key'].split('_').last data[:log_id] = record['key'].split('_').last
this_user = User.find_by(id: data['user_id']) this_user = User.find_by(id: data['user_id'])
unless this_user.nil? if this_user.nil?
data[:user_id] = this_user.id || nil
data[:username] = this_user.username || ""
data[:userpath] = "/u/#{this_user.username_lower}/activity"
data[:name] = this_user.name || ""
data[:avatar_template] = "/user_avatar/default/#{this_user.username_lower}/97/#{this_user.uploaded_avatar_id}.png"
else
data[:user_id] = nil data[:user_id] = nil
data[:username] = "" data[:username] = ""
data[:userpath] = "" data[:userpath] = ""
data[:name] = "" data[:name] = ""
data[:avatar_template] = "" data[:avatar_template] = ""
else
data[:user_id] = this_user.id || nil
data[:username] = this_user.username || ""
data[:userpath] = "/u/#{this_user.username_lower}/activity"
data[:name] = this_user.name || ""
data[:avatar_template] = "/user_avatar/default/#{this_user.username_lower}/97/#{this_user.uploaded_avatar_id}.png"
end end
self.new(api_name, data) self.new(api_name, data)
end end

Datei anzeigen

@ -1,8 +1,10 @@
# frozen_string_literal: true # frozen_string_literal: true
class CustomWizard::Subscription class CustomWizard::Subscription
STANDARD_PRODUCT_ID = 'prod_MH11woVoZU5AWb' PRODUCT_HIERARCHY = %w[
BUSINESS_PRODUCT_ID = 'prod_MH0wT627okh3Ef' community
COMMUNITY_PRODUCT_ID = 'prod_MU7l9EjxhaukZ7' standard
business
]
def self.attributes def self.attributes
{ {
@ -99,8 +101,29 @@ class CustomWizard::Subscription
} }
end end
attr_accessor :product_id,
:product_slug
def initialize def initialize
@subscription = find_subscription if CustomWizard::Subscription.client_installed?
result = SubscriptionClient.find_subscriptions("discourse-custom-wizard")
if result&.any?
ids_and_slugs = result.subscriptions.map do |subscription|
{
id: subscription.product_id,
slug: result.products[subscription.product_id]
}
end
id_and_slug = ids_and_slugs.sort do |a, b|
PRODUCT_HIERARCHY.index(b[:slug]) - PRODUCT_HIERARCHY.index(a[:slug])
end.first
@product_id = id_and_slug[:id]
@product_slug = id_and_slug[:slug]
end
end
end end
def includes?(feature, attribute, value = nil) def includes?(feature, attribute, value = nil)
@ -140,38 +163,21 @@ class CustomWizard::Subscription
end end
def standard? def standard?
@subscription.product_id === STANDARD_PRODUCT_ID product_slug === "standard"
end end
def business? def business?
@subscription.product_id === BUSINESS_PRODUCT_ID product_slug === "business"
end end
def community? def community?
@subscription.product_id === COMMUNITY_PRODUCT_ID product_slug === "community"
end end
def client_installed? def self.client_installed?
defined?(SubscriptionClient) == 'constant' && SubscriptionClient.class == Module defined?(SubscriptionClient) == 'constant' && SubscriptionClient.class == Module
end end
def find_subscription
subscription = nil
if client_installed?
subscription = SubscriptionClientSubscription.active
.where(product_id: [STANDARD_PRODUCT_ID, BUSINESS_PRODUCT_ID, COMMUNITY_PRODUCT_ID])
.order("product_id = '#{BUSINESS_PRODUCT_ID}' DESC")
.first
end
unless subscription
subscription = OpenStruct.new(product_id: nil)
end
subscription
end
def self.subscribed? def self.subscribed?
new.subscribed? new.subscribed?
end end
@ -192,10 +198,6 @@ class CustomWizard::Subscription
new.type new.type
end end
def self.client_installed?
new.client_installed?
end
def self.includes?(feature, attribute, value) def self.includes?(feature, attribute, value)
new.includes?(feature, attribute, value) new.includes?(feature, attribute, value)
end end

Datei anzeigen

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
# name: discourse-custom-wizard # name: discourse-custom-wizard
# about: Forms for Discourse. Better onboarding, structured posting, data enrichment, automated actions and much more. # about: Forms for Discourse. Better onboarding, structured posting, data enrichment, automated actions and much more.
# version: 2.3.5 # version: 2.4.3
# authors: Angus McLeod, Faizaan Gagan, Robert Barrow, Keegan George, Kaitlin Maddever # authors: Angus McLeod, Faizaan Gagan, Robert Barrow, Keegan George, Kaitlin Maddever
# url: https://github.com/paviliondev/discourse-custom-wizard # url: https://github.com/paviliondev/discourse-custom-wizard
# contact_emails: development@pavilion.tech # contact_emails: development@pavilion.tech

Datei anzeigen

@ -2,6 +2,16 @@
describe CustomWizard::Subscription do describe CustomWizard::Subscription do
let(:guests_permitted) { get_wizard_fixture("wizard/guests_permitted") } let(:guests_permitted) { get_wizard_fixture("wizard/guests_permitted") }
let!(:business_product_id) { SecureRandom.hex(8) }
let!(:standard_product_id) { SecureRandom.hex(8) }
let!(:community_product_id) { SecureRandom.hex(8) }
let!(:product_slugs) {
{
"#{business_product_id}" => "business",
"#{standard_product_id}" => "standard",
"#{community_product_id}" => "community"
}
}
def undefine_client_classes def undefine_client_classes
Object.send(:remove_const, :SubscriptionClient) if Object.constants.include?(:SubscriptionClient) Object.send(:remove_const, :SubscriptionClient) if Object.constants.include?(:SubscriptionClient)
@ -12,19 +22,12 @@ describe CustomWizard::Subscription do
load File.expand_path("#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/subscription_client.rb", __FILE__) load File.expand_path("#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/subscription_client.rb", __FILE__)
end end
def stub_client_methods
[:active, :where, :order, :first].each do |method|
SubscriptionClientSubscription.stubs(method)
.returns(SubscriptionClientSubscription)
end
SubscriptionClientSubscription.stubs(:product_id).returns(SecureRandom.hex(8))
end
after do after do
undefine_client_classes undefine_client_classes
end end
it "detects the subscription client" do it "detects the subscription client" do
undefine_client_classes
expect(described_class.client_installed?).to eq(false) expect(described_class.client_installed?).to eq(false)
end end
@ -50,7 +53,6 @@ describe CustomWizard::Subscription do
context "with subscription client" do context "with subscription client" do
before do before do
define_client_classes define_client_classes
stub_client_methods
end end
it "detects the subscription client" do it "detects the subscription client" do
@ -58,6 +60,10 @@ describe CustomWizard::Subscription do
end end
context "without a subscription" do context "without a subscription" do
before do
SubscriptionClient.stubs(:find_subscriptions).returns(nil)
end
it "has none type" do it "has none type" do
expect(described_class.type).to eq(:none) expect(described_class.type).to eq(:none)
end end
@ -71,59 +77,82 @@ describe CustomWizard::Subscription do
end end
end end
context "with a subscription" do context "with subscriptions" do
def get_subscription_result(product_ids)
result = SubscriptionClient::Subscriptions::Result.new
result.supplier = SubscriptionClientSupplier.new(product_slugs)
result.resource = SubscriptionClientResource.new
result.subscriptions = product_ids.map { |product_id| SubscriptionClientSubscription.new(product_id) }
result.products = product_slugs
result
end
let!(:business_subscription_result) { get_subscription_result([business_product_id]) }
let!(:standard_subscription_result) { get_subscription_result([standard_product_id]) }
let!(:community_subscription_result) { get_subscription_result([community_product_id]) }
let!(:multiple_subscription_result) { get_subscription_result([community_product_id, business_product_id]) }
it "handles mapped values" do it "handles mapped values" do
SubscriptionClientSubscription.stubs(:product_id).returns(CustomWizard::Subscription::STANDARD_PRODUCT_ID) SubscriptionClient.stubs(:find_subscriptions).returns(standard_subscription_result)
expect(described_class.includes?(:wizard, :permitted, guests_permitted["permitted"])).to eq(true) expect(described_class.includes?(:wizard, :permitted, guests_permitted["permitted"])).to eq(true)
SubscriptionClientSubscription.stubs(:product_id).returns(CustomWizard::Subscription::COMMUNITY_PRODUCT_ID) SubscriptionClient.stubs(:find_subscriptions).returns(community_subscription_result)
expect(described_class.includes?(:wizard, :permitted, guests_permitted["permitted"])).to eq(false) expect(described_class.includes?(:wizard, :permitted, guests_permitted["permitted"])).to eq(false)
end end
end
context "with standard subscription" do context "with a standard subscription" do
before do before do
SubscriptionClientSubscription.stubs(:product_id).returns(CustomWizard::Subscription::STANDARD_PRODUCT_ID) SubscriptionClient.stubs(:find_subscriptions).returns(standard_subscription_result)
end
it "detects standard type" do
expect(described_class.type).to eq(:standard)
end
it "standard features are included" do
expect(described_class.includes?(:wizard, :type, 'send_message')).to eq(true)
end
it "business features are not included" do
expect(described_class.includes?(:action, :type, 'create_category')).to eq(false)
end
end end
it "detects standard type" do context "with a business subscription" do
expect(described_class.type).to eq(:standard) before do
SubscriptionClient.stubs(:find_subscriptions).returns(business_subscription_result)
end
it "detects business type" do
expect(described_class.type).to eq(:business)
end
it "business features are included" do
expect(described_class.includes?(:action, :type, 'create_category')).to eq(true)
end
end end
it "standard features are included" do context "with a community subscription" do
expect(described_class.includes?(:wizard, :type, 'send_message')).to eq(true) before do
SubscriptionClient.stubs(:find_subscriptions).returns(community_subscription_result)
end
it "detects community type" do
expect(described_class.type).to eq(:community)
end
it "community features are included" do
expect(described_class.includes?(:action, :type, 'create_category')).to eq(true)
end
end end
it "business features are not included" do context "with multiple subscriptions" do
expect(described_class.includes?(:action, :type, 'create_category')).to eq(false) before do
end SubscriptionClient.stubs(:find_subscriptions).returns(multiple_subscription_result)
end end
context "with business subscription" do it "detects correct type in hierarchy" do
before do expect(described_class.type).to eq(:business)
SubscriptionClientSubscription.stubs(:product_id).returns(CustomWizard::Subscription::BUSINESS_PRODUCT_ID) end
end
it "detects business type" do
expect(described_class.type).to eq(:business)
end
it "business features are included" do
expect(described_class.includes?(:action, :type, 'create_category')).to eq(true)
end
end
context "with community subscription" do
before do
SubscriptionClientSubscription.stubs(:product_id).returns(CustomWizard::Subscription::COMMUNITY_PRODUCT_ID)
end
it "detects community type" do
expect(described_class.type).to eq(:community)
end
it "community features are included" do
expect(described_class.includes?(:action, :type, 'create_category')).to eq(true)
end end
end end
end end

Datei anzeigen

@ -1,4 +1,40 @@
# frozen_string_literal: true # frozen_string_literal: true
module SubscriptionClient; end module SubscriptionClient
class SubscriptionClientSubscription; end def self.find_subscriptions(resource_name)
end
end
class SubscriptionClientSupplier
attr_reader :product_slugs
def initialize(product_slugs)
@product_slugs = product_slugs
end
end
class SubscriptionClientResource
end
class SubscriptionClientSubscription
attr_reader :product_id
def initialize(product_id)
@product_id = product_id
end
end
module SubscriptionClient
class Subscriptions
class Result
attr_accessor :supplier,
:resource,
:subscriptions,
:products
def any?
supplier.present? && resource.present? && subscriptions.present? && products.present?
end
end
end
end

Datei anzeigen

@ -9,7 +9,6 @@ def get_wizard_fixture(path)
end end
def enable_subscription(type) def enable_subscription(type)
CustomWizard::Subscription.stubs(:client_installed?).returns(true)
CustomWizard::Subscription.stubs("#{type}?".to_sym).returns(true) CustomWizard::Subscription.stubs("#{type}?".to_sym).returns(true)
CustomWizard::Subscription.any_instance.stubs("#{type}?".to_sym).returns(true) CustomWizard::Subscription.any_instance.stubs("#{type}?".to_sym).returns(true)
end end

Datei anzeigen

@ -0,0 +1,39 @@
# frozen_string_literal: true
describe CustomWizard::AdminController do
fab!(:admin_user) { Fabricate(:user, admin: true) }
it "requires an admin" do
get "/admin/wizards.json"
expect(response.status).to eq(404)
end
context "with an admin" do
before do
sign_in(admin_user)
end
context "without a subscription" do
it "returns the right subscription details" do
get "/admin/wizards.json"
expect(response.parsed_body["subscribed"]).to eq(false)
expect(response.parsed_body["subscription_attributes"]).to eq(CustomWizard::Subscription.attributes.as_json)
expect(response.parsed_body["subscription_client_installed"]).to eq(false)
end
end
context "with a subscription" do
before do
enable_subscription("standard")
load File.expand_path("#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/subscription_client.rb", __FILE__)
end
it "returns the right subscription details" do
get "/admin/wizards.json"
expect(response.parsed_body["subscribed"]).to eq(true)
expect(response.parsed_body["subscription_type"]).to eq("standard")
expect(response.parsed_body["subscription_client_installed"]).to eq(true)
end
end
end
end

Datei anzeigen

@ -1,46 +0,0 @@
# frozen_string_literal: true
describe CustomWizard::AdminSubmissionsController do
fab!(:admin_user) { Fabricate(:user, admin: true) }
fab!(:user1) { Fabricate(:user) }
fab!(:user2) { Fabricate(:user) }
fab!(:user3) { Fabricate(:user) }
let(:template) { get_wizard_fixture("wizard") }
let(:template_2) {
temp = template.dup
temp["id"] = "super_mega_fun_wizard_2"
temp
}
before do
CustomWizard::Template.save(template, skip_jobs: true)
CustomWizard::Template.save(template_2, skip_jobs: true)
wizard1 = CustomWizard::Wizard.create(template["id"], user1)
wizard2 = CustomWizard::Wizard.create(template["id"], user2)
wizard3 = CustomWizard::Wizard.create(template_2["id"], user3)
CustomWizard::Submission.new(wizard1, step_1_field_1: "I am a user1's submission").save
CustomWizard::Submission.new(wizard2, step_1_field_1: "I am a user2's submission").save
CustomWizard::Submission.new(wizard3, step_1_field_1: "I am a user3's submission").save
sign_in(admin_user)
end
it "returns a list of wizards" do
get "/admin/wizards/submissions.json"
expect(response.parsed_body.length).to eq(2)
expect(response.parsed_body.first['id']).to eq(template['id'])
end
it "returns users' submissions for a wizard" do
get "/admin/wizards/submissions/#{template['id']}.json"
expect(response.parsed_body['submissions'].length).to eq(2)
end
it "downloads submissions" do
get "/admin/wizards/submissions/#{template_2['id']}/download"
expect(response.parsed_body.length).to eq(1)
end
end