Add TreeController and spec
This commit is contained in:
parent
884eb73297
commit
e33cbb9b42
4 changed files with 100 additions and 3 deletions
49
app/controllers/tree_controller.rb
Normal file
49
app/controllers/tree_controller.rb
Normal 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
|
|
@ -14,8 +14,8 @@ class Tree
|
||||||
to: :tree
|
to: :tree
|
||||||
|
|
||||||
def initialize(raw_tree, project, ref = nil, path = nil)
|
def initialize(raw_tree, project, ref = nil, path = nil)
|
||||||
@project, @ref, @path = project, ref, path,
|
@project, @ref, @path = project, ref, path
|
||||||
@tree = if path
|
@tree = if path.present?
|
||||||
raw_tree / path.dup.force_encoding('ascii-8bit')
|
raw_tree / path.dup.force_encoding('ascii-8bit')
|
||||||
else
|
else
|
||||||
raw_tree
|
raw_tree
|
||||||
|
@ -26,6 +26,10 @@ class Tree
|
||||||
tree.is_a?(Grit::Blob)
|
tree.is_a?(Grit::Blob)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def invalid?
|
||||||
|
tree.nil?
|
||||||
|
end
|
||||||
|
|
||||||
def empty?
|
def empty?
|
||||||
data.blank?
|
data.blank?
|
||||||
end
|
end
|
||||||
|
|
43
spec/controllers/tree_controller_spec.rb
Normal file
43
spec/controllers/tree_controller_spec.rb
Normal 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
|
|
@ -28,6 +28,7 @@ RSpec.configure do |config|
|
||||||
config.include LoginHelpers, type: :request
|
config.include LoginHelpers, type: :request
|
||||||
config.include GitoliteStub
|
config.include GitoliteStub
|
||||||
config.include FactoryGirl::Syntax::Methods
|
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
|
# 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
|
# examples within a transaction, remove the following line or assign false
|
||||||
|
|
Loading…
Add table
Reference in a new issue