summaryrefslogtreecommitdiff
path: root/spec/services/packages/debian/parse_debian822_service_spec.rb
blob: b67daca89c427825fdd361e7cb7a48ac6322fb94 (plain)
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# frozen_string_literal: true
require 'spec_helper'

RSpec.describe Packages::Debian::ParseDebian822Service do
  subject { described_class.new(input) }

  context 'with dpkg-deb --field output' do
    let(:input) do
      <<~HEREDOC
        Package: libsample0
        Source: sample
        Version: 1.2.3~alpha2
        Architecture: amd64
        Maintainer: John Doe <john.doe@example.com>
        Installed-Size: 9
        Section: libs
        Priority: optional
        Multi-Arch: same
        Homepage: https://gitlab.com/
        Description: Some mostly empty lib
         Used in GitLab tests.
         .
         Testing another paragraph.
      HEREDOC
    end

    it 'return as expected, preserving order' do
      expected = {
        'Package: libsample0' => {
          'Package': 'libsample0',
          'Source': 'sample',
          'Version': '1.2.3~alpha2',
          'Architecture': 'amd64',
          'Maintainer': 'John Doe <john.doe@example.com>',
          'Installed-Size': '9',
          'Section': 'libs',
          'Priority': 'optional',
          'Multi-Arch': 'same',
          'Homepage': 'https://gitlab.com/',
          'Description': "Some mostly empty lib\nUsed in GitLab tests.\n\nTesting another paragraph."
        }
      }

      expect(subject.execute.to_s).to eq(expected.to_s)
    end
  end

  context 'with control file' do
    let(:input) { fixture_file('packages/debian/sample/debian/control') }

    it 'return as expected, preserving order' do
      expected = {
        'Source: sample' => {
          'Source': 'sample',
          'Priority': 'optional',
          'Maintainer': 'John Doe <john.doe@example.com>',
          'Build-Depends': 'debhelper-compat (= 13)',
          'Standards-Version': '4.5.0',
          'Section': 'libs',
          'Homepage': 'https://gitlab.com/',
          # 'Vcs-Browser': 'https://salsa.debian.org/debian/sample-1.2.3',
          # '#Vcs-Git': 'https://salsa.debian.org/debian/sample-1.2.3.git',
          'Rules-Requires-Root': 'no'
        },
        'Package: sample-dev' => {
          'Package': 'sample-dev',
          'Section': 'libdevel',
          'Architecture': 'any',
          'Multi-Arch': 'same',
          'Depends': 'libsample0 (= ${binary:Version}), ${misc:Depends}',
          'Description': "Some mostly empty developpement files\nUsed in GitLab tests.\n\nTesting another paragraph."
        },
        'Package: libsample0' => {
          'Package': 'libsample0',
          'Architecture': 'any',
          'Multi-Arch': 'same',
          'Depends': '${shlibs:Depends}, ${misc:Depends}',
          'Description': "Some mostly empty lib\nUsed in GitLab tests.\n\nTesting another paragraph."
         },
         'Package: sample-udeb' => {
           'Package': 'sample-udeb',
           'Package-Type': 'udeb',
           'Architecture': 'any',
           'Depends': 'installed-base',
           'Description': 'Some mostly empty udeb'
         }
      }

      expect(subject.execute.to_s).to eq(expected.to_s)
    end
  end

  context 'with empty input' do
    let(:input) { '' }

    it 'return a empty hash' do
      expect(subject.execute).to eq({})
    end
  end

  context 'with unexpected continuation line' do
    let(:input) { ' continuation' }

    it 'raise error' do
      expect {subject.execute}.to raise_error(described_class::InvalidDebian822Error, 'Parse error. Unexpected continuation line')
    end
  end

  context 'with duplicate field' do
    let(:input) do
      <<~HEREDOC
        Package: libsample0
        Source: sample
        Source: sample
      HEREDOC
    end

    it 'raise error' do
      expect {subject.execute}.to raise_error(described_class::InvalidDebian822Error, "Duplicate field 'Source' in section 'Package: libsample0'")
    end
  end

  context 'with incorrect input' do
    let(:input) do
      <<~HEREDOC
        Hello
      HEREDOC
    end

    it 'raise error' do
      expect {subject.execute}.to raise_error(described_class::InvalidDebian822Error, 'Parse error on line Hello')
    end
  end

  context 'with duplicate section' do
    let(:input) do
      <<~HEREDOC
        Package: libsample0

        Package: libsample0
      HEREDOC
    end

    it 'raise error' do
      expect {subject.execute}.to raise_error(described_class::InvalidDebian822Error, "Duplicate section 'Package: libsample0'")
    end
  end
end