File: semantic_versionable_spec.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (129 lines) | stat: -rw-r--r-- 3,621 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe SemanticVersionable, feature_category: :mlops do
  using RSpec::Parameterized::TableSyntax

  before do
    model_class.reset_column_information
  end

  before_all do
    ActiveRecord::Schema.define do |_t|
      create_table :_test_semantic_versions, force: true do |t|
        t.integer :semver_major
        t.integer :semver_minor
        t.integer :semver_patch
        t.string :semver_prerelease
      end
    end
  end

  let(:model_class) do
    Class.new(ActiveRecord::Base) do
      include SemanticVersionable

      self.table_name = '_test_semantic_versions'
    end
  end

  let(:model_instance) { model_class.new(semver: semver) }

  describe '#semver=' do
    where(:semver, :major, :minor, :patch, :prerelease) do
      '1'             | nil | nil | nil | nil
      '1.2'           | nil | nil | nil | nil
      '1.2.3'         | 1   | 2   | 3   | nil
      '1.2.3-beta'    | 1   | 2   | 3   | 'beta'
      '1.2.3.beta'    | nil | nil | nil | nil
    end

    with_them do
      it do
        expect(model_instance.semver_major).to be major
        expect(model_instance.semver_minor).to be minor
        expect(model_instance.semver_patch).to be patch
        expect(model_instance.semver_prerelease).to eq prerelease
      end
    end

    context 'with a prefix' do
      before do
        ActiveRecord::Schema.define do
          add_column :_test_semantic_versions, :semver_prefixed, :boolean
        end
      end

      where(:semver, :major, :minor, :patch, :prerelease, :prefixed) do
        'v1.2.3'         | 1 | 2 | 3 | nil    | true
        'v1.2.3-beta'    | 1 | 2 | 3 | 'beta' | true
      end

      with_them do
        it do
          expect(model_instance.semver_major).to be major
          expect(model_instance.semver_minor).to be minor
          expect(model_instance.semver_patch).to be patch
          expect(model_instance.semver_prerelease).to eq prerelease
          expect(model_instance.semver_prefixed).to eq prefixed
        end
      end
    end
  end

  describe '#semver' do
    let(:model_instance) { model_class.new(semver: semver_input) }

    where(:semver_input, :semver_value) do
      '1'             | ''
      '1.2'           | ''
      '1.2.3'         | '1.2.3'
      '1.2.3-beta'    | '1.2.3-beta'
      '1.2.3.beta'    | ''
    end

    with_them do
      it do
        expect(model_instance.semver.to_s).to eq semver_value
      end
    end

    context 'with a prefix' do
      before do
        ActiveRecord::Schema.define do
          add_column :_test_semantic_versions, :semver_prefixed, :boolean
        end
      end

      where(:semver_input, :semver_value) do
        'v1.2.3'         | 'v1.2.3'
        'v1.2.3-beta'    | 'v1.2.3-beta'
      end

      with_them do
        it do
          expect(model_instance.semver.to_s).to eq semver_value
        end
      end
    end
  end

  describe 'scopes' do
    let(:first_release) { model_class.create!(semver: '1.0.1') }
    let(:second_release) { model_class.create!(semver: '3.0.1') }
    let(:patch) { model_class.create!(semver: 'v2.0.1') }

    describe '.order_by_semantic_version_asc' do
      it 'orders the versions by semantic order ascending' do
        expect(model_class.order_by_semantic_version_asc).to eq([first_release, patch, second_release])
      end
    end

    describe '.order_by_semantic_version_desc' do
      it 'orders the versions by semantic order descending' do
        expect(model_class.order_by_semantic_version_desc).to eq([second_release, patch, first_release])
      end
    end
  end
end