Verified Commit 4701bb3f authored by Hercules Merscher's avatar Hercules Merscher 🌴
Browse files

refactor: Experience as a struct

Having it as a struct will give us some properties of data values,
while still allowing us to create interal mutable variables to
implement stateful methods.
parent 2fbc56af
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -2,7 +2,10 @@

module Labkit
  module CoveredExperience
    class Experience < Data.define(:description, :feature_category, :urgency)
    Experience = Struct.new("Experience", :id, :description, :feature_category, :urgency) do
      def initialize(id:, description:, feature_category:, urgency:)
        super(id.freeze, description.freeze, feature_category.freeze, urgency.freeze)
      end
    end
  end
end
+1 −1
Original line number Diff line number Diff line
@@ -96,7 +96,7 @@ module Labkit
        return nil unless content.is_a?(Hash)

        errors = JSON::Validator.fully_validate(schema, content)
        return Experience.new(**content) if errors.empty?
        return Experience.new(id: experience_id, **content.transform_keys(&:to_sym)) if errors.empty?

        @invalid_definitions[experience_id] = errors.join(', ')
        warn("Invalid schema for #{file_path}")
+7 −3
Original line number Diff line number Diff line
@@ -51,18 +51,22 @@ RSpec.describe Labkit::CoveredExperience::Registry do
      it 'stores complete covered experience data' do
        registry = described_class.new(dir: covered_experiences_dir)

        expect(registry['merge_request_creation'].to_h).to match({
        expect(registry['merge_request_creation']).to eq Labkit::CoveredExperience::Experience.new(
          id: "merge_request_creation",
          description: 'Creating a new merge request in a project',
          feature_category: 'source_code_management',
          urgency: 'sync_fast'
        })
        )
      end

      it 'freezes the stored data' do
        registry = described_class.new(dir: covered_experiences_dir)

        experience = registry['merge_request_creation']
        expect(experience).to be_frozen
        expect(experience.id).to be_frozen
        expect(experience.description).to be_frozen
        expect(experience.feature_category).to be_frozen
        expect(experience.urgency).to be_frozen
      end

      it 'handles .yml extension' do