# frozen_string_literal: true require 'spec_helper' describe Gitlab::Diff::LinesUnfolder do let(:raw_diff) do <<-DIFF.strip_heredoc @@ -7,9 +7,6 @@ "tags": ["devel", "development", "nightly"], "desktop-file-name-prefix": "(Development) ", "finish-args": [ - "--share=ipc", "--socket=x11", - "--socket=wayland", - "--talk-name=org.gnome.OnlineAccounts", "--talk-name=org.freedesktop.Tracker1", "--filesystem=home", "--talk-name=org.gtk.vfs", "--talk-name=org.gtk.vfs.*", @@ -62,7 +59,7 @@ }, { "name": "gnome-desktop", - "config-opts": ["--disable-debug-tools", "--disable-udev"], + "config-opts": ["--disable-debug-tools", "--disable-"], "sources": [ { "type": "git", @@ -83,11 +80,6 @@ "buildsystem": "meson", "builddir": true, "name": "nautilus", - "config-opts": [ - "-Denable-desktop=false", - "-Denable-selinux=false", - "--libdir=/app/lib" - ], "sources": [ { "type": "git", DIFF end let(:raw_old_blob) do <<-BLOB.strip_heredoc { "app-id": "org.gnome.Nautilus", "runtime": "org.gnome.Platform", "runtime-version": "master", "sdk": "org.gnome.Sdk", "command": "nautilus", "tags": ["devel", "development", "nightly"], "desktop-file-name-prefix": "(Development) ", "finish-args": [ "--share=ipc", "--socket=x11", "--socket=wayland", "--talk-name=org.gnome.OnlineAccounts", "--talk-name=org.freedesktop.Tracker1", "--filesystem=home", "--talk-name=org.gtk.vfs", "--talk-name=org.gtk.vfs.*", "--filesystem=xdg-run/dconf", "--filesystem=~/.config/dconf:ro", "--talk-name=ca.desrt.dconf", "--env=DCONF_USER_CONFIG_DIR=.config/dconf" ], "cleanup": [ "/include", "/share/bash-completion" ], "modules": [ { "name": "exiv2", "sources": [ { "type": "archive", "url": "http://exiv2.org/builds/exiv2-0.26-trunk.tar.gz", "sha256": "c75e3c4a0811bf700d92c82319373b7a825a2331c12b8b37d41eb58e4f18eafb" }, { "type": "shell", "commands": [ "cp -f /usr/share/gnu-config/config.sub ./config/", "cp -f /usr/share/gnu-config/config.guess ./config/" ] } ] }, { "name": "gexiv2", "config-opts": [ "--disable-introspection" ], "sources": [ { "type": "git", "url": "https://git.gnome.org/browse/gexiv2" } ] }, { "name": "tracker", "cleanup": [ "/bin", "/etc", "/libexec" ], "config-opts": [ "--disable-miner-apps", "--disable-static", "--disable-tracker-extract", "--disable-tracker-needle", "--disable-tracker-preferences", "--disable-artwork", "--disable-tracker-writeback", "--disable-miner-user-guides", "--with-bash-completion-dir=no" ], "sources": [ { "type": "git", "url": "https://git.gnome.org/browse/tracker" } ] }, { "name": "gnome-desktop", "config-opts": ["--disable-debug-tools", "--disable-udev"], "sources": [ { "type": "git", "url": "https://git.gnome.org/browse/gnome-desktop" } ] }, { "name": "gnome-autoar", "sources": [ { "type": "git", "url": "https://git.gnome.org/browse/gnome-autoar" } ] }, { "buildsystem": "meson", "builddir": true, "name": "nautilus", "config-opts": [ "-Denable-desktop=false", "-Denable-selinux=false", "--libdir=/app/lib" ], "sources": [ { "type": "git", "url": "https://gitlab.gnome.org/GNOME/nautilus.git" } ] } ] }, { "app-id": "foo", "runtime": "foo", "runtime-version": "foo", "sdk": "foo", "command": "foo", "tags": ["foo", "bar", "kux"], "desktop-file-name-prefix": "(Foo) ", { "buildsystem": "meson", "builddir": true, "name": "nautilus", "sources": [ { "type": "git", "url": "https://gitlab.gnome.org/GNOME/nautilus.git" } ] } }, { "app-id": "foo", "runtime": "foo", "runtime-version": "foo", "sdk": "foo", "command": "foo", "tags": ["foo", "bar", "kux"], "desktop-file-name-prefix": "(Foo) ", { "buildsystem": "meson", "builddir": true, "name": "nautilus", "sources": [ { "type": "git", "url": "https://gitlab.gnome.org/GNOME/nautilus.git" } ] } } BLOB end let(:project) { create(:project) } let(:old_blob) { Blob.decorate(Gitlab::Git::Blob.new(data: raw_old_blob, size: 10)) } let(:diff) do Gitlab::Git::Diff.new(diff: raw_diff, new_path: "build-aux/flatpak/org.gnome.Nautilus.json", old_path: "build-aux/flatpak/org.gnome.Nautilus.json", a_mode: "100644", b_mode: "100644", new_file: false, renamed_file: false, deleted_file: false, too_large: false) end let(:diff_file) do Gitlab::Diff::File.new(diff, repository: project.repository) end before do allow(old_blob).to receive(:load_all_data!) allow(diff_file).to receive(:old_blob) { old_blob } end subject { described_class.new(diff_file, position) } context 'position requires a middle expansion and new match lines' do let(:position) do Gitlab::Diff::Position.new(base_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19", start_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19", head_sha: "1487062132228de836236c522fe52fed4980a46c", old_path: "build-aux/flatpak/org.gnome.Nautilus.json", new_path: "build-aux/flatpak/org.gnome.Nautilus.json", position_type: "text", old_line: 43, new_line: 40) end context 'blob lines' do let(:expected_blob_lines) do [[40, 40, " \"config-opts\": [ \"--disable-introspection\" ],"], [41, 41, " \"sources\": ["], [42, 42, " {"], [43, 43, " \"type\": \"git\","], [44, 44, " \"url\": \"https://git.gnome.org/browse/gexiv2\""], [45, 45, " }"], [46, 46, " ]"]] end it 'returns the extracted blob lines correctly' do extracted_lines = subject.blob_lines expect(extracted_lines.size).to eq(7) extracted_lines.each_with_index do |line, i| expect([line.old_line, line.new_line, line.text]).to eq(expected_blob_lines[i]) end end end context 'diff lines' do let(:expected_diff_lines) do [[7, 7, "@@ -7,9 +7,6 @@"], [7, 7, " \"tags\": [\"devel\", \"development\", \"nightly\"],"], [8, 8, " \"desktop-file-name-prefix\": \"(Development) \","], [9, 9, " \"finish-args\": ["], [10, 10, "- \"--share=ipc\", \"--socket=x11\","], [11, 10, "- \"--socket=wayland\","], [12, 10, "- \"--talk-name=org.gnome.OnlineAccounts\","], [13, 10, " \"--talk-name=org.freedesktop.Tracker1\","], [14, 11, " \"--filesystem=home\","], [15, 12, " \"--talk-name=org.gtk.vfs\", \"--talk-name=org.gtk.vfs.*\","], # New match line [40, 37, "@@ -40,7+37,7 @@"], # Injected blob lines [40, 37, " \"config-opts\": [ \"--disable-introspection\" ],"], [41, 38, " \"sources\": ["], [42, 39, " {"], [43, 40, " \"type\": \"git\","], # comment [44, 41, " \"url\": \"https://git.gnome.org/browse/gexiv2\""], [45, 42, " }"], [46, 43, " ]"], # end # Second match line [62, 59, "@@ -62,7+59,7 @@"], [62, 59, " },"], [63, 60, " {"], [64, 61, " \"name\": \"gnome-desktop\","], [65, 62, "- \"config-opts\": [\"--disable-debug-tools\", \"--disable-udev\"],"], [66, 62, "+ \"config-opts\": [\"--disable-debug-tools\", \"--disable-\"],"], [66, 63, " \"sources\": ["], [67, 64, " {"], [68, 65, " \"type\": \"git\","], [83, 80, "@@ -83,11 +80,6 @@"], [83, 80, " \"buildsystem\": \"meson\","], [84, 81, " \"builddir\": true,"], [85, 82, " \"name\": \"nautilus\","], [86, 83, "- \"config-opts\": ["], [87, 83, "- \"-Denable-desktop=false\","], [88, 83, "- \"-Denable-selinux=false\","], [89, 83, "- \"--libdir=/app/lib\""], [90, 83, "- ],"], [91, 83, " \"sources\": ["], [92, 84, " {"], [93, 85, " \"type\": \"git\","]] end it 'return merge of blob lines with diff lines correctly' do new_diff_lines = subject.unfolded_diff_lines expected_diff_lines.each_with_index do |expected_line, i| line = new_diff_lines[i] expect([line.old_pos, line.new_pos, line.text]).to eq(expected_line) end end it 'merged lines have correct line codes' do new_diff_lines = subject.unfolded_diff_lines new_diff_lines.each_with_index do |line, i| old_pos, new_pos = expected_diff_lines[i][0], expected_diff_lines[i][1] unless line.type == 'match' expect(line.line_code).to eq(Gitlab::Git.diff_line_code(diff_file.file_path, new_pos, old_pos)) end end end end end context 'position requires a middle expansion and no top match line' do let(:position) do Gitlab::Diff::Position.new(base_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19", start_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19", head_sha: "1487062132228de836236c522fe52fed4980a46c", old_path: "build-aux/flatpak/org.gnome.Nautilus.json", new_path: "build-aux/flatpak/org.gnome.Nautilus.json", position_type: "text", old_line: 16, new_line: 17) end context 'blob lines' do let(:expected_blob_lines) do [[16, 16, " \"--filesystem=xdg-run/dconf\", \"--filesystem=~/.config/dconf:ro\","], [17, 17, " \"--talk-name=ca.desrt.dconf\", \"--env=DCONF_USER_CONFIG_DIR=.config/dconf\""], [18, 18, " ],"], [19, 19, " \"cleanup\": [ \"/include\", \"/share/bash-completion\" ],"]] end it 'returns the extracted blob lines correctly' do extracted_lines = subject.blob_lines expect(extracted_lines.size).to eq(4) extracted_lines.each_with_index do |line, i| expect([line.old_line, line.new_line, line.text]).to eq(expected_blob_lines[i]) end end end context 'diff lines' do let(:expected_diff_lines) do [[7, 7, "@@ -7,9 +7,6 @@"], [7, 7, " \"tags\": [\"devel\", \"development\", \"nightly\"],"], [8, 8, " \"desktop-file-name-prefix\": \"(Development) \","], [9, 9, " \"finish-args\": ["], [10, 10, "- \"--share=ipc\", \"--socket=x11\","], [11, 10, "- \"--socket=wayland\","], [12, 10, "- \"--talk-name=org.gnome.OnlineAccounts\","], [13, 10, " \"--talk-name=org.freedesktop.Tracker1\","], [14, 11, " \"--filesystem=home\","], [15, 12, " \"--talk-name=org.gtk.vfs\", \"--talk-name=org.gtk.vfs.*\","], # No new match needed # Injected blob lines [16, 13, " \"--filesystem=xdg-run/dconf\", \"--filesystem=~/.config/dconf:ro\","], [17, 14, " \"--talk-name=ca.desrt.dconf\", \"--env=DCONF_USER_CONFIG_DIR=.config/dconf\""], [18, 15, " ],"], [19, 16, " \"cleanup\": [ \"/include\", \"/share/bash-completion\" ],"], # end # Second match line [62, 59, "@@ -62,4+59,4 @@"], [62, 59, " },"], [63, 60, " {"], [64, 61, " \"name\": \"gnome-desktop\","], [65, 62, "- \"config-opts\": [\"--disable-debug-tools\", \"--disable-udev\"],"], [66, 62, "+ \"config-opts\": [\"--disable-debug-tools\", \"--disable-\"],"], [66, 63, " \"sources\": ["], [67, 64, " {"], [68, 65, " \"type\": \"git\","], [83, 80, "@@ -83,11 +80,6 @@"], [83, 80, " \"buildsystem\": \"meson\","], [84, 81, " \"builddir\": true,"], [85, 82, " \"name\": \"nautilus\","], [86, 83, "- \"config-opts\": ["], [87, 83, "- \"-Denable-desktop=false\","], [88, 83, "- \"-Denable-selinux=false\","], [89, 83, "- \"--libdir=/app/lib\""], [90, 83, "- ],"], [91, 83, " \"sources\": ["], [92, 84, " {"], [93, 85, " \"type\": \"git\","]] end it 'return merge of blob lines with diff lines correctly' do new_diff_lines = subject.unfolded_diff_lines expected_diff_lines.each_with_index do |expected_line, i| line = new_diff_lines[i] expect([line.old_pos, line.new_pos, line.text]).to eq(expected_line) end end it 'merged lines have correct line codes' do new_diff_lines = subject.unfolded_diff_lines new_diff_lines.each_with_index do |line, i| old_pos, new_pos = expected_diff_lines[i][0], expected_diff_lines[i][1] unless line.type == 'match' expect(line.line_code).to eq(Gitlab::Git.diff_line_code(diff_file.file_path, new_pos, old_pos)) end end end end end context 'position requires a middle expansion and no bottom match line' do let(:position) do Gitlab::Diff::Position.new(base_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19", start_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19", head_sha: "1487062132228de836236c522fe52fed4980a46c", old_path: "build-aux/flatpak/org.gnome.Nautilus.json", new_path: "build-aux/flatpak/org.gnome.Nautilus.json", position_type: "text", old_line: 82, new_line: 79) end context 'blob lines' do let(:expected_blob_lines) do [[79, 79, " }"], [80, 80, " ]"], [81, 81, " },"], [82, 82, " {"]] end it 'returns the extracted blob lines correctly' do extracted_lines = subject.blob_lines expect(extracted_lines.size).to eq(4) extracted_lines.each_with_index do |line, i| expect([line.old_line, line.new_line, line.text]).to eq(expected_blob_lines[i]) end end end context 'diff lines' do let(:expected_diff_lines) do [[7, 7, "@@ -7,9 +7,6 @@"], [7, 7, " \"tags\": [\"devel\", \"development\", \"nightly\"],"], [8, 8, " \"desktop-file-name-prefix\": \"(Development) \","], [9, 9, " \"finish-args\": ["], [10, 10, "- \"--share=ipc\", \"--socket=x11\","], [11, 10, "- \"--socket=wayland\","], [12, 10, "- \"--talk-name=org.gnome.OnlineAccounts\","], [13, 10, " \"--talk-name=org.freedesktop.Tracker1\","], [14, 11, " \"--filesystem=home\","], [15, 12, " \"--talk-name=org.gtk.vfs\", \"--talk-name=org.gtk.vfs.*\","], [62, 59, "@@ -62,7 +59,7 @@"], [62, 59, " },"], [63, 60, " {"], [64, 61, " \"name\": \"gnome-desktop\","], [65, 62, "- \"config-opts\": [\"--disable-debug-tools\", \"--disable-udev\"],"], [66, 62, "+ \"config-opts\": [\"--disable-debug-tools\", \"--disable-\"],"], [66, 63, " \"sources\": ["], [67, 64, " {"], [68, 65, " \"type\": \"git\","], # New top match line [79, 76, "@@ -79,4+76,4 @@"], # Injected blob lines [79, 76, " }"], [80, 77, " ]"], [81, 78, " },"], [82, 79, " {"], # end # No new second match line [83, 80, " \"buildsystem\": \"meson\","], [84, 81, " \"builddir\": true,"], [85, 82, " \"name\": \"nautilus\","], [86, 83, "- \"config-opts\": ["], [87, 83, "- \"-Denable-desktop=false\","], [88, 83, "- \"-Denable-selinux=false\","], [89, 83, "- \"--libdir=/app/lib\""], [90, 83, "- ],"], [91, 83, " \"sources\": ["], [92, 84, " {"], [93, 85, " \"type\": \"git\","]] end it 'return merge of blob lines with diff lines correctly' do new_diff_lines = subject.unfolded_diff_lines expected_diff_lines.each_with_index do |expected_line, i| line = new_diff_lines[i] expect([line.old_pos, line.new_pos, line.text]).to eq(expected_line) end end it 'merged lines have correct line codes' do new_diff_lines = subject.unfolded_diff_lines new_diff_lines.each_with_index do |line, i| old_pos, new_pos = expected_diff_lines[i][0], expected_diff_lines[i][1] unless line.type == 'match' expect(line.line_code).to eq(Gitlab::Git.diff_line_code(diff_file.file_path, new_pos, old_pos)) end end end end end context 'position requires a short top expansion' do let(:position) do Gitlab::Diff::Position.new(base_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19", start_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19", head_sha: "1487062132228de836236c522fe52fed4980a46c", old_path: "build-aux/flatpak/org.gnome.Nautilus.json", new_path: "build-aux/flatpak/org.gnome.Nautilus.json", position_type: "text", old_line: 6, new_line: 6) end context 'blob lines' do let(:expected_blob_lines) do [[3, 3, " \"runtime\": \"org.gnome.Platform\","], [4, 4, " \"runtime-version\": \"master\","], [5, 5, " \"sdk\": \"org.gnome.Sdk\","], [6, 6, " \"command\": \"nautilus\","]] end it 'returns the extracted blob lines correctly' do extracted_lines = subject.blob_lines expect(extracted_lines.size).to eq(4) extracted_lines.each_with_index do |line, i| expect([line.old_line, line.new_line, line.text]).to eq(expected_blob_lines[i]) end end end context 'diff lines' do let(:expected_diff_lines) do # New match line [[3, 3, "@@ -3,4+3,4 @@"], # Injected blob lines [3, 3, " \"runtime\": \"org.gnome.Platform\","], [4, 4, " \"runtime-version\": \"master\","], [5, 5, " \"sdk\": \"org.gnome.Sdk\","], [6, 6, " \"command\": \"nautilus\","], # end [7, 7, " \"tags\": [\"devel\", \"development\", \"nightly\"],"], [8, 8, " \"desktop-file-name-prefix\": \"(Development) \","], [9, 9, " \"finish-args\": ["], [10, 10, "- \"--share=ipc\", \"--socket=x11\","], [11, 10, "- \"--socket=wayland\","], [12, 10, "- \"--talk-name=org.gnome.OnlineAccounts\","], [13, 10, " \"--talk-name=org.freedesktop.Tracker1\","], [14, 11, " \"--filesystem=home\","], [15, 12, " \"--talk-name=org.gtk.vfs\", \"--talk-name=org.gtk.vfs.*\","], [62, 59, "@@ -62,7 +59,7 @@"], [62, 59, " },"], [63, 60, " {"], [64, 61, " \"name\": \"gnome-desktop\","], [65, 62, "- \"config-opts\": [\"--disable-debug-tools\", \"--disable-udev\"],"], [66, 62, "+ \"config-opts\": [\"--disable-debug-tools\", \"--disable-\"],"], [66, 63, " \"sources\": ["], [67, 64, " {"], [68, 65, " \"type\": \"git\","], [83, 80, "@@ -83,11 +80,6 @@"], [83, 80, " \"buildsystem\": \"meson\","], [84, 81, " \"builddir\": true,"], [85, 82, " \"name\": \"nautilus\","], [86, 83, "- \"config-opts\": ["], [87, 83, "- \"-Denable-desktop=false\","], [88, 83, "- \"-Denable-selinux=false\","], [89, 83, "- \"--libdir=/app/lib\""], [90, 83, "- ],"], [91, 83, " \"sources\": ["], [92, 84, " {"], [93, 85, " \"type\": \"git\","]] end it 'return merge of blob lines with diff lines correctly' do new_diff_lines = subject.unfolded_diff_lines expected_diff_lines.each_with_index do |expected_line, i| line = new_diff_lines[i] expect([line.old_pos, line.new_pos, line.text]).to eq(expected_line) end end it 'merged lines have correct line codes' do new_diff_lines = subject.unfolded_diff_lines new_diff_lines.each_with_index do |line, i| old_pos, new_pos = expected_diff_lines[i][0], expected_diff_lines[i][1] unless line.type == 'match' expect(line.line_code).to eq(Gitlab::Git.diff_line_code(diff_file.file_path, new_pos, old_pos)) end end end end end context 'position sits between two match lines (no expasion needed)' do let(:position) do Gitlab::Diff::Position.new(base_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19", start_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19", head_sha: "1487062132228de836236c522fe52fed4980a46c", old_path: "build-aux/flatpak/org.gnome.Nautilus.json", new_path: "build-aux/flatpak/org.gnome.Nautilus.json", position_type: "text", old_line: 64, new_line: 61) end context 'diff lines' do it 'returns nil' do expect(subject.unfolded_diff_lines).to be_nil end end end context 'position requires bottom expansion and new match lines' do let(:position) do Gitlab::Diff::Position.new(base_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19", start_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19", head_sha: "1487062132228de836236c522fe52fed4980a46c", old_path: "build-aux/flatpak/org.gnome.Nautilus.json", new_path: "build-aux/flatpak/org.gnome.Nautilus.json", position_type: "text", old_line: 107, new_line: 99) end context 'blob lines' do let(:expected_blob_lines) do [[104, 104, " \"sdk\": \"foo\","], [105, 105, " \"command\": \"foo\","], [106, 106, " \"tags\": [\"foo\", \"bar\", \"kux\"],"], [107, 107, " \"desktop-file-name-prefix\": \"(Foo) \","], [108, 108, " {"], [109, 109, " \"buildsystem\": \"meson\","], [110, 110, " \"builddir\": true,"]] end it 'returns the extracted blob lines correctly' do extracted_lines = subject.blob_lines expect(extracted_lines.size).to eq(7) extracted_lines.each_with_index do |line, i| expect([line.old_line, line.new_line, line.text]).to eq(expected_blob_lines[i]) end end end context 'diff lines' do let(:expected_diff_lines) do [[7, 7, "@@ -7,9 +7,6 @@"], [7, 7, " \"tags\": [\"devel\", \"development\", \"nightly\"],"], [8, 8, " \"desktop-file-name-prefix\": \"(Development) \","], [9, 9, " \"finish-args\": ["], [10, 10, "- \"--share=ipc\", \"--socket=x11\","], [11, 10, "- \"--socket=wayland\","], [12, 10, "- \"--talk-name=org.gnome.OnlineAccounts\","], [13, 10, " \"--talk-name=org.freedesktop.Tracker1\","], [14, 11, " \"--filesystem=home\","], [15, 12, " \"--talk-name=org.gtk.vfs\", \"--talk-name=org.gtk.vfs.*\","], [62, 59, "@@ -62,7 +59,7 @@"], [62, 59, " },"], [63, 60, " {"], [64, 61, " \"name\": \"gnome-desktop\","], [65, 62, "- \"config-opts\": [\"--disable-debug-tools\", \"--disable-udev\"],"], [66, 62, "+ \"config-opts\": [\"--disable-debug-tools\", \"--disable-\"],"], [66, 63, " \"sources\": ["], [67, 64, " {"], [68, 65, " \"type\": \"git\","], [83, 80, "@@ -83,11 +80,6 @@"], [83, 80, " \"buildsystem\": \"meson\","], [84, 81, " \"builddir\": true,"], [85, 82, " \"name\": \"nautilus\","], [86, 83, "- \"config-opts\": ["], [87, 83, "- \"-Denable-desktop=false\","], [88, 83, "- \"-Denable-selinux=false\","], [89, 83, "- \"--libdir=/app/lib\""], [90, 83, "- ],"], [91, 83, " \"sources\": ["], [92, 84, " {"], [93, 85, " \"type\": \"git\","], # New match line [104, 96, "@@ -104,7+96,7 @@"], # Injected blob lines [104, 96, " \"sdk\": \"foo\","], [105, 97, " \"command\": \"foo\","], [106, 98, " \"tags\": [\"foo\", \"bar\", \"kux\"],"], [107, 99, " \"desktop-file-name-prefix\": \"(Foo) \","], [108, 100, " {"], [109, 101, " \"buildsystem\": \"meson\","], [110, 102, " \"builddir\": true,"]] # end end it 'return merge of blob lines with diff lines correctly' do new_diff_lines = subject.unfolded_diff_lines expected_diff_lines.each_with_index do |expected_line, i| line = new_diff_lines[i] expect([line.old_pos, line.new_pos, line.text]).to eq(expected_line) end end it 'merged lines have correct line codes' do new_diff_lines = subject.unfolded_diff_lines new_diff_lines.each_with_index do |line, i| old_pos, new_pos = expected_diff_lines[i][0], expected_diff_lines[i][1] unless line.type == 'match' expect(line.line_code).to eq(Gitlab::Git.diff_line_code(diff_file.file_path, new_pos, old_pos)) end end end end context 'position requires bottom expansion and no new match line' do let(:position) do Gitlab::Diff::Position.new(base_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19", start_sha: "1c59dfa64afbea8c721bb09a06a9d326c952ea19", head_sha: "1487062132228de836236c522fe52fed4980a46c", old_path: "build-aux/flatpak/org.gnome.Nautilus.json", new_path: "build-aux/flatpak/org.gnome.Nautilus.json", position_type: "text", old_line: 95, new_line: 87) end context 'blob lines' do let(:expected_blob_lines) do [[94, 94, " \"url\": \"https://gitlab.gnome.org/GNOME/nautilus.git\""], [95, 95, " }"], [96, 96, " ]"], [97, 97, " }"], [98, 98, " ]"]] end it 'returns the extracted blob lines correctly' do extracted_lines = subject.blob_lines expect(extracted_lines.size).to eq(5) extracted_lines.each_with_index do |line, i| expect([line.old_line, line.new_line, line.text]).to eq(expected_blob_lines[i]) end end end context 'diff lines' do let(:expected_diff_lines) do [[7, 7, "@@ -7,9 +7,6 @@"], [7, 7, " \"tags\": [\"devel\", \"development\", \"nightly\"],"], [8, 8, " \"desktop-file-name-prefix\": \"(Development) \","], [9, 9, " \"finish-args\": ["], [10, 10, "- \"--share=ipc\", \"--socket=x11\","], [11, 10, "- \"--socket=wayland\","], [12, 10, "- \"--talk-name=org.gnome.OnlineAccounts\","], [13, 10, " \"--talk-name=org.freedesktop.Tracker1\","], [14, 11, " \"--filesystem=home\","], [15, 12, " \"--talk-name=org.gtk.vfs\", \"--talk-name=org.gtk.vfs.*\","], [62, 59, "@@ -62,7 +59,7 @@"], [62, 59, " },"], [63, 60, " {"], [64, 61, " \"name\": \"gnome-desktop\","], [65, 62, "- \"config-opts\": [\"--disable-debug-tools\", \"--disable-udev\"],"], [66, 62, "+ \"config-opts\": [\"--disable-debug-tools\", \"--disable-\"],"], [66, 63, " \"sources\": ["], [67, 64, " {"], [68, 65, " \"type\": \"git\","], [83, 80, "@@ -83,11 +80,6 @@"], [83, 80, " \"buildsystem\": \"meson\","], [84, 81, " \"builddir\": true,"], [85, 82, " \"name\": \"nautilus\","], [86, 83, "- \"config-opts\": ["], [87, 83, "- \"-Denable-desktop=false\","], [88, 83, "- \"-Denable-selinux=false\","], [89, 83, "- \"--libdir=/app/lib\""], [90, 83, "- ],"], [91, 83, " \"sources\": ["], [92, 84, " {"], [93, 85, " \"type\": \"git\","], # No new match line # Injected blob lines [94, 86, " \"url\": \"https://gitlab.gnome.org/GNOME/nautilus.git\""], [95, 87, " }"], [96, 88, " ]"], [97, 89, " }"], [98, 90, " ]"]] # end end it 'return merge of blob lines with diff lines correctly' do new_diff_lines = subject.unfolded_diff_lines expected_diff_lines.each_with_index do |expected_line, i| line = new_diff_lines[i] expect([line.old_pos, line.new_pos, line.text]).to eq(expected_line) end end it 'merged lines have correct line codes' do new_diff_lines = subject.unfolded_diff_lines new_diff_lines.each_with_index do |line, i| old_pos, new_pos = expected_diff_lines[i][0], expected_diff_lines[i][1] unless line.type == 'match' expect(line.line_code).to eq(Gitlab::Git.diff_line_code(diff_file.file_path, new_pos, old_pos)) end end end end end end end