user_browses_files_spec.rb 8.18 KB
Newer Older
1
require "spec_helper"
2

3
describe "User browses files" do
4 5 6 7
  let(:fork_message) do
    "You're not allowed to make changes to this project directly. "\
    "A fork of this project has been created that you can make changes in, so you can submit a merge request."
  end
8 9
  let(:project) { create(:project, :repository, name: "Shop") }
  let(:project2) { create(:project, :repository, name: "Another Project", path: "another-project") }
10
  let(:tree_path_root_ref) { project_tree_path(project, project.repository.root_ref) }
Rémy Coutable's avatar
Rémy Coutable committed
11
  let(:user) { project.owner }
12 13 14 15 16

  before do
    sign_in(user)
  end

17
  it "shows last commit for current directory" do
18 19
    visit(tree_path_root_ref)

20
    click_link("files")
21

22 23 24 25
    last_commit = project.repository.last_commit_for_path(project.default_branch, "files")

    page.within(".blob-commit-info") do
      expect(page).to have_content(last_commit.short_id).and have_content(last_commit.author_name)
26 27 28
    end
  end

29
  context "when browsing the master branch" do
30 31 32 33
    before do
      visit(tree_path_root_ref)
    end

34 35 36 37
    it "shows files from a repository" do
      expect(page).to have_content("VERSION")
                 .and have_content(".gitignore")
                 .and have_content("LICENSE")
38 39
    end

40 41 42
    it "shows the `Browse Directory` link" do
      click_link("files")
      click_link("History")
43

44
      expect(page).to have_link("Browse Directory").and have_no_link("Browse Code")
45 46
    end

47 48 49
    it "shows the `Browse File` link" do
      page.within(".tree-table") do
        click_link("README.md")
50 51
      end

52 53 54
      click_link("History")

      expect(page).to have_link("Browse File").and have_no_link("Browse Files")
55 56
    end

57 58
    it "shows the `Browse Files` link" do
      click_link("History")
59

60
      expect(page).to have_link("Browse Files").and have_no_link("Browse Directory")
61 62
    end

63 64 65
    it "redirects to the permalink URL" do
      click_link(".gitignore")
      click_link("Permalink")
66 67 68 69 70 71 72

      permalink_path = project_blob_path(project, "#{project.repository.commit.sha}/.gitignore")

      expect(current_path).to eq(permalink_path)
    end
  end

73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
  context "when browsing the `markdown` branch", :js do
    context "when browsing the root" do
      before do
        visit(project_tree_path(project, "markdown"))
      end

      it "shows correct files and links" do
        # rubocop:disable Lint/Void
        # Test the full URLs of links instead of relative paths by `have_link(text: "...", href: "...")`.
        find("a", text: /^empty$/)["href"]            == project_tree_url(project, "markdown")
        find("a", text: /^#id$/)["href"]              == project_tree_url(project, "markdown", anchor: "#id")
        find("a", text: %r{^/#id$})["href"]           == project_tree_url(project, "markdown", anchor: "#id")
        find("a", text: /^README.md#id$/)["href"]     == project_blob_url(project, "markdown/README.md", anchor: "#id")
        find("a", text: %r{^d/README.md#id$})["href"] == project_blob_url(project, "d/markdown/README.md", anchor: "#id")
        # rubocop:enable Lint/Void

        expect(current_path).to eq(project_tree_path(project, "markdown"))
        expect(page).to have_content("README.md")
                   .and have_content("CHANGELOG")
                   .and have_content("Welcome to GitLab GitLab is a free project and repository management application")
                   .and have_link("GitLab API doc")
                   .and have_link("GitLab API website")
                   .and have_link("Rake tasks")
                   .and have_link("backup and restore procedure")
                   .and have_link("GitLab API doc directory")
                   .and have_link("Maintenance")
                   .and have_header_with_correct_id_and_link(2, "Application details", "application-details")
      end

      it "shows correct content of file" do
        click_link("GitLab API doc")

        expect(current_path).to eq(project_blob_path(project, "markdown/doc/api/README.md"))
        expect(page).to have_content("All API requests require authentication")
                   .and have_content("Contents")
                   .and have_link("Users")
                   .and have_link("Rake tasks")
                   .and have_header_with_correct_id_and_link(1, "GitLab API", "gitlab-api")

        click_link("Users")

        expect(current_path).to eq(project_blob_path(project, "markdown/doc/api/users.md"))
        expect(page).to have_content("Get a list of users.")

        page.go_back

        click_link("Rake tasks")

        expect(current_path).to eq(project_tree_path(project, "markdown/doc/raketasks"))
        expect(page).to have_content("backup_restore.md").and have_content("maintenance.md")

        click_link("shop")
        click_link("Maintenance")

        expect(current_path).to eq(project_blob_path(project, "markdown/doc/raketasks/maintenance.md"))
        expect(page).to have_content("bundle exec rake gitlab:env:info RAILS_ENV=production")

        click_link("shop")

        page.within(".tree-table") do
          click_link("README.md")
        end

        page.go_back

        page.within(".tree-table") do
          click_link("d")
        end

        # rubocop:disable Lint/Void
        # Test the full URLs of links instead of relative paths by `have_link(text: "...", href: "...")`.
        find("a", text: /^empty$/)["href"] == project_tree_url(project, "markdown/d")
        # rubocop:enable Lint/Void

        page.within(".tree-table") do
          click_link("README.md")
        end

        # rubocop:disable Lint/Void
        # Test the full URLs of links instead of relative paths by `have_link(text: "...", href: "...")`.
        find("a", text: /^empty$/)["href"] == project_blob_url(project, "markdown/d/README.md")
        # rubocop:enable Lint/Void
      end

      it "shows correct content of directory" do
        click_link("GitLab API doc directory")

        expect(current_path).to eq(project_tree_path(project, "markdown/doc/api"))
        expect(page).to have_content("README.md").and have_content("users.md")

        click_link("Users")

        expect(current_path).to eq(project_blob_path(project, "markdown/doc/api/users.md"))
        expect(page).to have_content("List users").and have_content("Get a list of users.")
      end
    end
  end

  context "when browsing a specific ref" do
    let(:ref) { project_tree_path(project, "6d39438") }

174
    before do
175
      visit(ref)
176 177
    end

178 179 180
    it "shows files from a repository for `6d39438`" do
      expect(current_path).to eq(ref)
      expect(page).to have_content(".gitignore").and have_content("LICENSE")
181 182
    end

183 184
    it "shows files from a repository with apostroph in its name", :js do
      first(".js-project-refs-dropdown").click
185

186
      page.within(".project-refs-form") do
187 188 189
        click_link("'test'")
      end

190
      expect(page).to have_selector(".dropdown-toggle-text", text: "'test'")
191 192 193

      visit(project_tree_path(project, "'test'"))

194
      expect(page).to have_css(".tree-commit-link").and have_no_content("Loading commit data...")
195 196
    end

197 198
    it "shows the code with a leading dot in the directory", :js do
      first(".js-project-refs-dropdown").click
199

200 201
      page.within(".project-refs-form") do
        click_link("fix")
202 203
      end

204
      visit(project_tree_path(project, "fix/.testdir"))
205

206
      expect(page).to have_css(".tree-commit-link").and have_no_content("Loading commit data...")
207 208
    end

209 210
    it "does not show the permalink link" do
      click_link(".gitignore")
211

212
      expect(page).not_to have_link("permalink")
213 214 215
    end
  end

216
  context "when browsing a file content" do
217 218
    before do
      visit(tree_path_root_ref)
219 220

      click_link(".gitignore")
221 222
    end

223 224
    it "shows a file content", :js do
      expect(page).to have_content("*.rbc")
225
    end
226

227 228
    it "is possible to blame" do
      click_link("Blame")
229

230 231 232
      expect(page).to have_content("*.rb")
                 .and have_content("Dmitriy Zaporozhets")
                 .and have_content("Initial commit")
233
    end
234 235
  end

236
  context "when browsing a raw file" do
237
    before do
238 239 240
      path = File.join(RepoHelpers.sample_commit.id, RepoHelpers.sample_blob.path)

      visit(project_blob_path(project, path))
241 242
    end

243 244 245 246
    it "shows a raw file content" do
      click_link("Open raw")

      expect(source).to eq("") # Body is filled in by gitlab-workhorse
247 248 249
    end
  end
end