diff --git a/lib/gitlab/diff/file.rb b/lib/gitlab/diff/file.rb
index adc78616f6451fd0ee75369ae469963375195b6f..62c0d38884ac1495baad07155bed745f36ed964c 100644
--- a/lib/gitlab/diff/file.rb
+++ b/lib/gitlab/diff/file.rb
@@ -21,7 +21,7 @@ module Gitlab
       end
 
       def mode_changed?
-        diff.a_mode && diff.b_mode && diff.a_mode != diff.b_mode
+        !!(diff.a_mode && diff.b_mode && diff.a_mode != diff.b_mode)
       end
 
       def parser
diff --git a/spec/lib/gitlab/diff/file_spec.rb b/spec/lib/gitlab/diff/file_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..074c1255930bda093fbcec475838bd84d1e1e430
--- /dev/null
+++ b/spec/lib/gitlab/diff/file_spec.rb
@@ -0,0 +1,25 @@
+require 'spec_helper'
+
+describe Gitlab::Diff::File do
+  include RepoHelpers
+
+  let(:project) { create(:project) }
+  let(:commit) { project.repository.commit(sample_commit.id) }
+  let(:diff) { commit.diffs.first }
+  let(:diff_file) { Gitlab::Diff::File.new(project, commit, diff) }
+
+  describe :diff_lines do
+    let(:diff_lines) { diff_file.diff_lines }
+
+    it { diff_lines.size.should == 30 }
+    it { diff_lines.first.should be_kind_of(Gitlab::Diff::Line) }
+  end
+
+  describe :blob_exists? do
+    it { diff_file.blob_exists?.should be_true }
+  end
+
+  describe :mode_changed? do
+    it { diff_file.mode_changed?.should be_false }
+  end
+end
diff --git a/spec/lib/gitlab/diff/parser_spec.rb b/spec/lib/gitlab/diff/parser_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9ec906e4f9a1cdd284d45197cbfcec6fcb59f0e5
--- /dev/null
+++ b/spec/lib/gitlab/diff/parser_spec.rb
@@ -0,0 +1,95 @@
+require 'spec_helper'
+
+describe Gitlab::Diff::Parser do
+  include RepoHelpers
+
+  let(:project) { create(:project) }
+  let(:commit) { project.repository.commit(sample_commit.id) }
+  let(:diff) { commit.diffs.first }
+  let(:parser) { Gitlab::Diff::Parser.new }
+
+  describe :parse do
+    let(:diff) do
+      <<eos
+--- a/files/ruby/popen.rb
++++ b/files/ruby/popen.rb
+@@ -6,12 +6,18 @@ module Popen
+
+   def popen(cmd, path=nil)
+     unless cmd.is_a?(Array)
+-      raise "System commands must be given as an array of strings"
++      raise RuntimeError, "System commands must be given as an array of strings"
+     end
+
+     path ||= Dir.pwd
+-    vars = { "PWD" => path }
+-    options = { chdir: path }
++
++    vars = {
++      "PWD" => path
++    }
++
++    options = {
++      chdir: path
++    }
+
+     unless File.directory?(path)
+       FileUtils.mkdir_p(path)
+@@ -19,6 +25,7 @@ module Popen
+
+     @cmd_output = ""
+     @cmd_status = 0
++
+     Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|
+       @cmd_output << stdout.read
+       @cmd_output << stderr.read
+eos
+    end
+
+    let(:path) { 'files/ruby/popen.rb' }
+
+    before do
+      @lines = parser.parse(diff.lines, path, path)
+    end
+
+    it { @lines.size.should == 30 }
+
+    describe 'lines' do
+      describe 'first line' do
+        let(:line) { @lines.first }
+
+        it { line.type.should == 'match' }
+        it { line.old_pos.should == 6 }
+        it { line.new_pos.should == 6 }
+        it { line.text.should == '@@ -6,12 +6,18 @@ module Popen' }
+      end
+
+      describe 'removal line' do
+        let(:line) { @lines[10] }
+
+        it { line.type.should == 'old' }
+        it { line.old_pos.should == 14 }
+        it { line.new_pos.should == 13 }
+        it { line.text.should == '-    options = { chdir: path }' }
+      end
+
+      describe 'addition line' do
+        let(:line) { @lines[16] }
+
+        it { line.type.should == 'new' }
+        it { line.old_pos.should == 15 }
+        it { line.new_pos.should == 18 }
+        it { line.text.should == '+    options = {' }
+      end
+
+      describe 'unchanged line' do
+        let(:line) { @lines.last }
+
+        it { line.type.should == nil }
+        it { line.old_pos.should == 24 }
+        it { line.new_pos.should == 31 }
+        it { line.text.should == '       @cmd_output &lt;&lt; stderr.read' }
+      end
+    end
+  end
+end