Commit cb9cf077de8bf315842a7f357b65ec7e5b5ce0de

Authored by Robert Speicher
1 parent bb494203

Refactor and cover search_autocomplete_source

app/helpers/application_helper.rb
@@ -98,51 +98,6 @@ module ApplicationHelper @@ -98,51 +98,6 @@ module ApplicationHelper
98 grouped_options_for_select(options, @ref || @project.default_branch) 98 grouped_options_for_select(options, @ref || @project.default_branch)
99 end 99 end
100 100
101 - def search_autocomplete_source  
102 - return unless current_user  
103 -  
104 - projects = current_user.authorized_projects.map { |p| { label: "project: #{simple_sanitize(p.name_with_namespace)}", url: project_path(p) } }  
105 - groups = current_user.authorized_groups.map { |group| { label: "group: #{simple_sanitize(group.name)}", url: group_path(group) } }  
106 -  
107 - default_nav = [  
108 - { label: "My Profile settings", url: profile_path },  
109 - { label: "My SSH Keys", url: profile_keys_path },  
110 - { label: "My Dashboard", url: root_path },  
111 - { label: "Admin Section", url: admin_root_path },  
112 - ]  
113 -  
114 - help_nav = [  
115 - { label: "help: API Help", url: help_api_path },  
116 - { label: "help: Markdown Help", url: help_markdown_path },  
117 - { label: "help: Permissions Help", url: help_permissions_path },  
118 - { label: "help: Public Access Help", url: help_public_access_path },  
119 - { label: "help: Rake Tasks Help", url: help_raketasks_path },  
120 - { label: "help: SSH Keys Help", url: help_ssh_path },  
121 - { label: "help: System Hooks Help", url: help_system_hooks_path },  
122 - { label: "help: Web Hooks Help", url: help_web_hooks_path },  
123 - { label: "help: Workflow Help", url: help_workflow_path },  
124 - ]  
125 -  
126 - project_nav = []  
127 - if @project && @project.repository.exists? && @project.repository.root_ref  
128 - project_nav = [  
129 - { label: "#{simple_sanitize(@project.name_with_namespace)} - Files", url: project_tree_path(@project, @ref || @project.repository.root_ref) },  
130 - { label: "#{simple_sanitize(@project.name_with_namespace)} - Commits", url: project_commits_path(@project, @ref || @project.repository.root_ref) },  
131 - { label: "#{simple_sanitize(@project.name_with_namespace)} - Network", url: project_network_path(@project, @ref || @project.repository.root_ref) },  
132 - { label: "#{simple_sanitize(@project.name_with_namespace)} - Graph", url: project_graph_path(@project, @ref || @project.repository.root_ref) },  
133 - { label: "#{simple_sanitize(@project.name_with_namespace)} - Issues", url: project_issues_path(@project) },  
134 - { label: "#{simple_sanitize(@project.name_with_namespace)} - Merge Requests", url: project_merge_requests_path(@project) },  
135 - { label: "#{simple_sanitize(@project.name_with_namespace)} - Milestones", url: project_milestones_path(@project) },  
136 - { label: "#{simple_sanitize(@project.name_with_namespace)} - Snippets", url: project_snippets_path(@project) },  
137 - { label: "#{simple_sanitize(@project.name_with_namespace)} - Team", url: project_team_index_path(@project) },  
138 - { label: "#{simple_sanitize(@project.name_with_namespace)} - Wall", url: project_wall_path(@project) },  
139 - { label: "#{simple_sanitize(@project.name_with_namespace)} - Wiki", url: project_wikis_path(@project) },  
140 - ]  
141 - end  
142 -  
143 - [groups, projects, default_nav, project_nav, help_nav].flatten.to_json  
144 - end  
145 -  
146 def emoji_autocomplete_source 101 def emoji_autocomplete_source
147 # should be an array of strings 102 # should be an array of strings
148 # so to_s can be called, because it is sufficient and to_json is too slow 103 # so to_s can be called, because it is sufficient and to_json is too slow
app/helpers/search_helper.rb 0 → 100644
@@ -0,0 +1,78 @@ @@ -0,0 +1,78 @@
  1 +module SearchHelper
  2 + def search_autocomplete_source
  3 + return unless current_user
  4 +
  5 + [
  6 + groups_autocomplete,
  7 + projects_autocomplete,
  8 + default_autocomplete,
  9 + project_autocomplete,
  10 + help_autocomplete
  11 + ].flatten.to_json
  12 + end
  13 +
  14 + private
  15 +
  16 + # Autocomplete results for various settings pages
  17 + def default_autocomplete
  18 + [
  19 + { label: "My Profile settings", url: profile_path },
  20 + { label: "My SSH Keys", url: profile_keys_path },
  21 + { label: "My Dashboard", url: root_path },
  22 + { label: "Admin Section", url: admin_root_path },
  23 + ]
  24 + end
  25 +
  26 + # Autocomplete results for internal help pages
  27 + def help_autocomplete
  28 + [
  29 + { label: "help: API Help", url: help_api_path },
  30 + { label: "help: Markdown Help", url: help_markdown_path },
  31 + { label: "help: Permissions Help", url: help_permissions_path },
  32 + { label: "help: Public Access Help", url: help_public_access_path },
  33 + { label: "help: Rake Tasks Help", url: help_raketasks_path },
  34 + { label: "help: SSH Keys Help", url: help_ssh_path },
  35 + { label: "help: System Hooks Help", url: help_system_hooks_path },
  36 + { label: "help: Web Hooks Help", url: help_web_hooks_path },
  37 + { label: "help: Workflow Help", url: help_workflow_path },
  38 + ]
  39 + end
  40 +
  41 + # Autocomplete results for the current project, if it's defined
  42 + def project_autocomplete
  43 + if @project && @project.repository.exists? && @project.repository.root_ref
  44 + prefix = simple_sanitize(@project.name_with_namespace)
  45 + ref = @ref || @project.repository.root_ref
  46 +
  47 + [
  48 + { label: "#{prefix} - Files", url: project_tree_path(@project, ref) },
  49 + { label: "#{prefix} - Commits", url: project_commits_path(@project, ref) },
  50 + { label: "#{prefix} - Network", url: project_network_path(@project, ref) },
  51 + { label: "#{prefix} - Graph", url: project_graph_path(@project, ref) },
  52 + { label: "#{prefix} - Issues", url: project_issues_path(@project) },
  53 + { label: "#{prefix} - Merge Requests", url: project_merge_requests_path(@project) },
  54 + { label: "#{prefix} - Milestones", url: project_milestones_path(@project) },
  55 + { label: "#{prefix} - Snippets", url: project_snippets_path(@project) },
  56 + { label: "#{prefix} - Team", url: project_team_index_path(@project) },
  57 + { label: "#{prefix} - Wall", url: project_wall_path(@project) },
  58 + { label: "#{prefix} - Wiki", url: project_wikis_path(@project) },
  59 + ]
  60 + else
  61 + []
  62 + end
  63 + end
  64 +
  65 + # Autocomplete results for the current user's groups
  66 + def groups_autocomplete
  67 + current_user.authorized_groups.map do |group|
  68 + { label: "group: #{simple_sanitize(group.name)}", url: group_path(group) }
  69 + end
  70 + end
  71 +
  72 + # Autocomplete results for the current user's projects
  73 + def projects_autocomplete
  74 + current_user.authorized_projects.map do |p|
  75 + { label: "project: #{simple_sanitize(p.name_with_namespace)}", url: project_path(p) }
  76 + end
  77 + end
  78 +end
spec/helpers/search_helper_spec.rb 0 → 100644
@@ -0,0 +1,64 @@ @@ -0,0 +1,64 @@
  1 +require 'spec_helper'
  2 +
  3 +describe SearchHelper do
  4 + # Override simple_sanitize for our testing purposes
  5 + def simple_sanitize(str)
  6 + str
  7 + end
  8 +
  9 + describe 'search_autocomplete_source' do
  10 + context "with no current user" do
  11 + before { stub!(:current_user).and_return(nil) }
  12 +
  13 + it "it returns nil" do
  14 + search_autocomplete_source.should be_nil
  15 + end
  16 + end
  17 +
  18 + context "with a user" do
  19 + let(:user) { create(:user) }
  20 + let(:result) { JSON.parse(search_autocomplete_source) }
  21 +
  22 + before do
  23 + stub!(:current_user).and_return(user)
  24 + end
  25 +
  26 + it "includes Help sections" do
  27 + result.select { |h| h['label'] =~ /^help:/ }.length.should == 9
  28 + end
  29 +
  30 + it "includes default sections" do
  31 + result.count { |h| h['label'] =~ /^(My|Admin)\s/ }.should == 4
  32 + end
  33 +
  34 + it "includes the user's groups" do
  35 + create(:group).add_owner(user)
  36 + result.count { |h| h['label'] =~ /^group:/ }.should == 1
  37 + end
  38 +
  39 + it "includes the user's projects" do
  40 + create(:project, namespace: create(:namespace, owner: user))
  41 + result.count { |h| h['label'] =~ /^project:/ }.should == 1
  42 + end
  43 +
  44 + context "with a current project" do
  45 + before { @project = create(:project_with_code) }
  46 +
  47 + it "includes project-specific sections" do
  48 + result.count { |h| h['label'] =~ /^#{@project.name_with_namespace} - / }.should == 11
  49 + end
  50 +
  51 + it "uses @ref in urls if defined" do
  52 + @ref = "foo_bar"
  53 + result.count { |h| h['url'] == project_tree_path(@project, @ref) }.should == 1
  54 + end
  55 + end
  56 +
  57 + context "with no current project" do
  58 + it "does not include project-specific sections" do
  59 + result.count { |h| h['label'] =~ /Files$/ }.should == 0
  60 + end
  61 + end
  62 + end
  63 + end
  64 +end