Add TreeController and spec

This commit is contained in:
Robert Speicher 2012-09-17 12:38:59 -04:00
parent 884eb73297
commit e33cbb9b42
4 changed files with 100 additions and 3 deletions

View file

@ -0,0 +1,49 @@
# Controller for viewing a repository's file structure
class TreeController < ApplicationController
# Thrown when given an invalid path
class InvalidPathError < StandardError; end
include RefExtractor
layout "project"
before_filter :project
# Authorize
before_filter :add_project_abilities
before_filter :authorize_read_project!
before_filter :authorize_code_access!
before_filter :require_non_empty_project
before_filter :define_tree_vars
def show
respond_to do |format|
format.html
# Disable cache so browser history works
format.js { no_cache_headers }
end
end
private
def define_tree_vars
@ref, @path = extract_ref(params[:id])
@id = File.join(@ref, @path)
@repo = @project.repo
@commit = CommitDecorator.decorate(@project.commit(@ref))
@tree = Tree.new(@commit.tree, @project, @ref, @path.gsub(/^\//, ''))
@tree = TreeDecorator.new(@tree)
raise InvalidPathError if @tree.invalid?
@hex_path = Digest::SHA1.hexdigest(@path)
@history_path = project_tree_path(@project, @id)
@logs_path = logs_file_project_ref_path(@project, @ref, @path)
rescue NoMethodError, InvalidPathError
not_found!
end
end

View file

@ -1,5 +1,5 @@
class Tree
include Linguist::BlobHelper
include Linguist::BlobHelper
attr_accessor :path, :tree, :project, :ref
delegate :contents,
@ -14,8 +14,8 @@ class Tree
to: :tree
def initialize(raw_tree, project, ref = nil, path = nil)
@project, @ref, @path = project, ref, path,
@tree = if path
@project, @ref, @path = project, ref, path
@tree = if path.present?
raw_tree / path.dup.force_encoding('ascii-8bit')
else
raw_tree
@ -26,6 +26,10 @@ class Tree
tree.is_a?(Grit::Blob)
end
def invalid?
tree.nil?
end
def empty?
data.blank?
end

View file

@ -0,0 +1,43 @@
require 'spec_helper'
describe TreeController do
let(:project) { create(:project) }
let(:user) { create(:user) }
before do
sign_in(user)
project.add_access(user, :read, :admin)
project.stub(:branches).and_return(['master', 'foo/bar/baz'])
project.stub(:tags).and_return(['v1.0.0', 'v2.0.0'])
controller.instance_variable_set(:@project, project)
end
describe "GET show" do
# Make sure any errors accessing the tree in our views bubble up to this spec
render_views
before { get :show, project_id: project.code, id: id }
context "valid branch, no path" do
let(:id) { 'master' }
it { should respond_with(:success) }
end
context "valid branch, valid path" do
let(:id) { 'master/README.md' }
it { should respond_with(:success) }
end
context "valid branch, invalid path" do
let(:id) { 'master/invalid-path.rb' }
it { should respond_with(:not_found) }
end
context "invalid branch, valid path" do
let(:id) { 'invalid-branch/README.md' }
it { should respond_with(:not_found) }
end
end
end

View file

@ -28,6 +28,7 @@ RSpec.configure do |config|
config.include LoginHelpers, type: :request
config.include GitoliteStub
config.include FactoryGirl::Syntax::Methods
config.include Devise::TestHelpers, type: :controller
# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false