application_helper_spec.rb 8.5 KB
Newer Older
1 2 3
require 'spec_helper'

describe ApplicationHelper do
4 5
  describe 'current_controller?' do
    before do
S
skv 已提交
6
      controller.stub(:controller_name).and_return('foo')
7 8 9 10 11 12 13 14 15
    end

    it "returns true when controller matches argument" do
      current_controller?(:foo).should be_true
    end

    it "returns false when controller does not match argument" do
      current_controller?(:bar).should_not be_true
    end
16 17 18 19 20

    it "should take any number of arguments" do
      current_controller?(:baz, :bar).should_not be_true
      current_controller?(:baz, :bar, :foo).should be_true
    end
21 22
  end

R
Robert Speicher 已提交
23 24
  describe 'current_action?' do
    before do
S
skv 已提交
25
      allow(self).to receive(:action_name).and_return('foo')
R
Robert Speicher 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
    end

    it "returns true when action matches argument" do
      current_action?(:foo).should be_true
    end

    it "returns false when action does not match argument" do
      current_action?(:bar).should_not be_true
    end

    it "should take any number of arguments" do
      current_action?(:baz, :bar).should_not be_true
      current_action?(:baz, :bar, :foo).should be_true
    end
  end
D
Dmitriy Zaporozhets 已提交
41

S
Steven Thonus 已提交
42 43 44 45 46 47 48
  describe "group_icon" do
    avatar_file_path = File.join(Rails.root, 'public', 'gitlab_logo.png')

    it "should return an url for the avatar" do
      group = create(:group)
      group.avatar = File.open(avatar_file_path)
      group.save!
49
      group_icon(group.path).to_s.should match("/uploads/group/avatar/#{ group.id }/gitlab_logo.png")
S
Steven Thonus 已提交
50 51 52 53 54
    end

    it "should give default avatar_icon when no avatar is present" do
      group = create(:group)
      group.save!
D
Dmitriy Zaporozhets 已提交
55
      group_icon(group.path).should match("group_avatar.png")
S
Steven Thonus 已提交
56 57 58
    end
  end

59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
  describe 'project_icon' do
    avatar_file_path = File.join(Rails.root, 'public', 'gitlab_logo.png')

    it 'should return an url for the avatar' do
      project = create(:project)
      project.avatar = File.open(avatar_file_path)
      project.save!
      project_icon(project.to_param).to_s.should ==
        "/uploads/project/avatar/#{ project.id }/gitlab_logo.png"
    end

    it "should give uploaded icon when present" do
      project = create(:project)
      project.save!

      Project.any_instance.stub(:avatar_in_git).and_return(true)

      project_icon(project.to_param).to_s.should match(
        image_tag(project_avatar_path(project)))
    end
  end

S
Steven Thonus 已提交
81 82 83 84 85 86 87
  describe "avatar_icon" do
    avatar_file_path = File.join(Rails.root, 'public', 'gitlab_logo.png')

    it "should return an url for the avatar" do
      user = create(:user)
      user.avatar = File.open(avatar_file_path)
      user.save!
88
      avatar_icon(user.email).to_s.should match("/uploads/user/avatar/#{ user.id }/gitlab_logo.png")
S
Steven Thonus 已提交
89 90
    end

91 92 93 94 95 96 97
    it "should return an url for the avatar with relative url" do
      Gitlab.config.gitlab.stub(relative_url_root: "/gitlab")
      Gitlab.config.gitlab.stub(url: Settings.send(:build_gitlab_url))

      user = create(:user)
      user.avatar = File.open(avatar_file_path)
      user.save!
98
      avatar_icon(user.email).to_s.should match("/gitlab/uploads/user/avatar/#{ user.id }/gitlab_logo.png")
99 100
    end

S
Steven Thonus 已提交
101
    it "should call gravatar_icon when no avatar is present" do
D
Dmitriy Zaporozhets 已提交
102
      user = create(:user, email: 'test@example.com')
S
Steven Thonus 已提交
103
      user.save!
104
      avatar_icon(user.email).to_s.should == "http://www.gravatar.com/avatar/55502f40dc8b7c769880b10874abc9d0?s=40&d=identicon"
S
Steven Thonus 已提交
105 106
    end
  end
R
Robert Speicher 已提交
107

108 109 110 111
  describe "gravatar_icon" do
    let(:user_email) { 'user@email.com' }

    it "should return a generic avatar path when Gravatar is disabled" do
D
Dmitriy Zaporozhets 已提交
112
      ApplicationSetting.any_instance.stub(gravatar_enabled?: false)
M
Marvin Frick 已提交
113
      gravatar_icon(user_email).should match('no_avatar.png')
114 115 116
    end

    it "should return a generic avatar path when email is blank" do
M
Marvin Frick 已提交
117
      gravatar_icon('').should match('no_avatar.png')
118 119
    end

S
Sergey Linnik 已提交
120
    it "should return default gravatar url" do
D
Dmitriy Zaporozhets 已提交
121
      Gitlab.config.gitlab.stub(https: false)
S
Sergey Linnik 已提交
122 123 124
      gravatar_icon(user_email).should match('http://www.gravatar.com/avatar/b58c6f14d292556214bd64909bcdb118')
    end

125
    it "should use SSL when appropriate" do
D
Dmitriy Zaporozhets 已提交
126
      Gitlab.config.gitlab.stub(https: true)
127 128 129
      gravatar_icon(user_email).should match('https://secure.gravatar.com')
    end

S
Sergey Linnik 已提交
130
    it "should return custom gravatar path when gravatar_url is set" do
S
skv 已提交
131
      allow(self).to receive(:request).and_return(double(:ssl? => false))
R
Riyad Preukschas 已提交
132
      Gitlab.config.gravatar.stub(:plain_url).and_return('http://example.local/?s=%{size}&hash=%{hash}')
S
Sergey Linnik 已提交
133 134 135
      gravatar_icon(user_email, 20).should == 'http://example.local/?s=20&hash=b58c6f14d292556214bd64909bcdb118'
    end

136
    it "should accept a custom size" do
S
skv 已提交
137
      allow(self).to receive(:request).and_return(double(:ssl? => false))
138 139
      gravatar_icon(user_email, 64).should match(/\?s=64/)
    end
S
Sergey Linnik 已提交
140 141

    it "should use default size when size is wrong" do
S
skv 已提交
142
      allow(self).to receive(:request).and_return(double(:ssl? => false))
S
Sergey Linnik 已提交
143 144 145 146
      gravatar_icon(user_email, nil).should match(/\?s=40/)
    end

    it "should be case insensitive" do
S
skv 已提交
147
      allow(self).to receive(:request).and_return(double(:ssl? => false))
S
Sergey Linnik 已提交
148 149
      gravatar_icon(user_email).should == gravatar_icon(user_email.upcase + " ")
    end
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
  end

  describe "grouped_options_refs" do
    # Override Rails' grouped_options_for_select helper since HTML is harder to work with
    def grouped_options_for_select(options, *args)
      options
    end

    let(:options) { grouped_options_refs }

    before do
      # Must be an instance variable
      @project = create(:project)
    end

    it "includes a list of branch names" do
      options[0][0].should == 'Branches'
167
      options[0][1].should include('master', 'feature')
168 169 170 171
    end

    it "includes a list of tag names" do
      options[1][0].should == 'Tags'
172
      options[1][1].should include('v1.0.0','v1.1.0')
173 174 175 176 177
    end

    it "includes a specific commit ref if defined" do
      # Must be an instance variable
      @ref = '2ed06dc41dbb5936af845b87d79e05bbf24c73b8'
S
Sergey Linnik 已提交
178

179 180 181 182 183 184 185 186 187 188
      options[2][0].should == 'Commit'
      options[2][1].should == [@ref]
    end

    it "sorts tags in a natural order" do
      # Stub repository.tag_names to make sure we get some valid testing data
      expect(@project.repository).to receive(:tag_names).and_return(["v1.0.9", "v1.0.10", "v2.0", "v3.1.4.2", "v1.0.9a"])

      options[1][1].should == ["v3.1.4.2", "v2.0", "v1.0.10", "v1.0.9a", "v1.0.9"]
    end
189
  end
190 191 192 193

  describe "user_color_scheme_class" do
    context "with current_user is nil" do
      it "should return a string" do
S
skv 已提交
194
        allow(self).to receive(:current_user).and_return(nil)
195 196 197 198 199 200 201 202 203
        user_color_scheme_class.should be_kind_of(String)
      end
    end

    context "with a current_user" do
      (1..5).each do |color_scheme_id|
        context "with color_scheme_id == #{color_scheme_id}" do
          it "should return a string" do
            current_user = double(:color_scheme_id => color_scheme_id)
S
skv 已提交
204
            allow(self).to receive(:current_user).and_return(current_user)
205 206 207 208 209 210 211
            user_color_scheme_class.should be_kind_of(String)
          end
        end
      end
    end
  end

R
Robert Speicher 已提交
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
  describe "simple_sanitize" do
    let(:a_tag) { '<a href="#">Foo</a>' }

    it "allows the a tag" do
      simple_sanitize(a_tag).should == a_tag
    end

    it "allows the span tag" do
      input = '<span class="foo">Bar</span>'
      simple_sanitize(input).should == input
    end

    it "disallows other tags" do
      input = "<strike><b>#{a_tag}</b></strike>"
      simple_sanitize(input).should == a_tag
    end
  end
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251

  describe "link_to" do

    it "should not include rel=nofollow for internal links" do
      expect(link_to("Home", root_path)).to eq("<a href=\"/\">Home</a>")
    end

    it "should include rel=nofollow for external links" do
      expect(link_to("Example", "http://www.example.com")).to eq("<a href=\"http://www.example.com\" rel=\"nofollow\">Example</a>")
    end

    it "should include re=nofollow for external links and honor existing html_options" do
      expect(
        link_to("Example", "http://www.example.com", class: "toggle", data: {toggle: "dropdown"})
      ).to eq("<a class=\"toggle\" data-toggle=\"dropdown\" href=\"http://www.example.com\" rel=\"nofollow\">Example</a>")
    end

    it "should include rel=nofollow for external links and preserver other rel values" do
      expect(
        link_to("Example", "http://www.example.com", rel: "noreferrer")
      ).to eq("<a href=\"http://www.example.com\" rel=\"noreferrer nofollow\">Example</a>")
    end
  end
252 253 254 255 256 257 258 259 260

  describe 'markup_render' do
    let(:content) { 'Noël' }

    it 'should preserve encoding' do
      content.encoding.name.should == 'UTF-8'
      expect(render_markup('foo.rst', content).encoding.name).to eq('UTF-8')
    end
  end
261
end