Fixed extension remote import creator to transform exchange templates

Necessary to apply the same transforms to exchange templates as we do for extension templates since both use Liquid templates.

Issue: 306
Milestone: patch
This commit is contained in:
Brooke Kuhlmann
2026-04-27 16:02:12 -06:00
parent bc7525472b
commit 5dbdde0c81
2 changed files with 54 additions and 4 deletions
@@ -11,11 +11,14 @@ module Terminus
# Creates extension from plugin (recipe).
class Creator
include Deps[
:logger,
"aspects.extensions.importers.remote.transformer",
keyer: "aspects.extensions.importers.remote.transformers.template_keys",
repository: "repositories.extension",
model_repository: "repositories.model",
exchange_repository: "repositories.extension_exchange"
]
include Dry::Monads[:result]
def initialize(problem_detail: Aspects::ProblemDetail, **)
@@ -49,14 +52,27 @@ module Terminus
end
end
def add_exchanges id, attributes
def add_exchanges extension_id, attributes
headers, verb, templates, body = attributes.values_at :poll_headers,
:poll_verb,
:poll_template,
:poll_body
templates.each do |template|
exchange_repository.create extension_id: id, headers:, verb:, template:, body:
templates.each do |content|
template = transform_exchange_template content
exchange_repository.create extension_id:, headers:, verb:, template:, body:
end
end
def transform_exchange_template content
case keyer.call content
in Success(content) then content
in Failure(message)
logger.debug { message }
Core::EMPTY_STRING
else
logger.error { "Unable to transform exchange template." }
Core::EMPTY_STRING
end
end
end
@@ -9,6 +9,8 @@ RSpec.describe Terminus::Aspects::Extensions::Importers::Remote::Creator, :db do
instance_double Terminus::Aspects::Extensions::Importers::Remote::Transformer
end
include_context "with application dependencies"
describe "#call" do
let :attributes do
{
@@ -46,7 +48,7 @@ RSpec.describe Terminus::Aspects::Extensions::Importers::Remote::Creator, :db do
poll_verb: "post",
poll_body: {name: "test"}
allow(transformer).to receive(:call).and_return Success(attributes)
creator.call(1).success
creator.call 1
data = Terminus::Repositories::ExtensionExchange.new.all.map(&:to_h)
@@ -60,6 +62,38 @@ RSpec.describe Terminus::Aspects::Extensions::Importers::Remote::Creator, :db do
)
end
context "when exchange template can't be transformned" do
subject(:creator) { described_class.new(transformer:, keyer:) }
let :keyer do
instance_double(
Terminus::Aspects::Extensions::Importers::Remote::Transformers::TemplateKeys,
call: Failure("Danger!")
)
end
before { allow(transformer).to receive(:call).and_return Success(attributes) }
it "uses empty string for template" do
creator.call 1
data = Terminus::Repositories::ExtensionExchange.new.all.map(&:to_h)
expect(data).to contain_exactly(hash_including(template: ""))
end
it "logs debug message" do
creator.call 1
expect(logger.reread).to match(/DEBUG.+Danger!/)
end
it "logs error with unknown result" do
allow(keyer).to receive(:call).and_return "Danger!"
creator.call 1
expect(logger.reread).to match(/ERROR.+Unable to transform/)
end
end
it "fails with duplicate import" do
Factory[:extension, name: "test"]
allow(transformer).to receive(:call).and_return Success(attributes)