From bd9f6870917d867d98c43866be2411cd3efa9b43 Mon Sep 17 00:00:00 2001 From: Thomas von Deyen Date: Mon, 5 Jul 2021 14:47:33 +0200 Subject: [PATCH] Add Ingredient Audio serializer --- .../json_api/ingredient_audio_serializer.rb | 40 +++++++++++++++ .../ingredient_audio_serializer_spec.rb | 50 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 app/serializers/alchemy/json_api/ingredient_audio_serializer.rb create mode 100644 spec/serializers/alchemy/json_api/ingredient_audio_serializer_spec.rb diff --git a/app/serializers/alchemy/json_api/ingredient_audio_serializer.rb b/app/serializers/alchemy/json_api/ingredient_audio_serializer.rb new file mode 100644 index 0000000..aa6c199 --- /dev/null +++ b/app/serializers/alchemy/json_api/ingredient_audio_serializer.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require "alchemy/json_api/ingredient_serializer" + +module Alchemy + module JsonApi + class IngredientAudioSerializer + include IngredientSerializer + + attributes( + :autoplay, + :controls, + :muted, + :loop, + ) + + attribute :value do |ingredient| + ingredient.attachment&.url + end + + with_options if: ->(ingredient) { ingredient.attachment } do + attribute :audio_name do |ingredient| + ingredient.attachment.name + end + + attribute :audio_file_name do |ingredient| + ingredient.attachment.file_name + end + + attribute :audio_mime_type do |ingredient| + ingredient.attachment.file_mime_type + end + + attribute :audio_file_size do |ingredient| + ingredient.attachment.file_size + end + end + end + end +end diff --git a/spec/serializers/alchemy/json_api/ingredient_audio_serializer_spec.rb b/spec/serializers/alchemy/json_api/ingredient_audio_serializer_spec.rb new file mode 100644 index 0000000..7fedc46 --- /dev/null +++ b/spec/serializers/alchemy/json_api/ingredient_audio_serializer_spec.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.describe Alchemy::JsonApi::IngredientAudioSerializer do + let(:element) { FactoryBot.build_stubbed(:alchemy_element) } + let(:attachment) { FactoryBot.build_stubbed(:alchemy_attachment) } + let(:ingredient) do + Alchemy::Ingredients::Audio.new( + role: "audio", + element: element, + attachment: attachment, + autoplay: false, + controls: true, + muted: true, + ) + end + + subject(:serializer) { described_class.new(ingredient) } + + it_behaves_like "an ingredient serializer" + + describe "attributes" do + subject { serializer.serializable_hash[:data][:attributes] } + + it "has the right keys and values", :aggregate_failures do + expect(subject[:autoplay]).to eq(false) + expect(subject[:controls]).to eq(true) + expect(subject[:muted]).to eq(true) + expect(subject[:leep]).to eq(nil) + expect(subject[:value]).to match(/\/attachment\/#{attachment.id}\/show/o) + expect(subject[:audio_name]).to eq("image") + expect(subject[:audio_file_name]).to eq("image.png") + expect(subject[:audio_mime_type]).to eq("image/png") + expect(subject[:audio_file_size]).to eq(70) + end + end + + context "With no audio set" do + let(:attachment) { nil } + + describe "attributes" do + subject { serializer.serializable_hash[:data][:attributes] } + + it "has the right keys and values" do + expect(subject[:ingredient]).to be nil + end + end + end +end