code.gitea.io/gitea@v1.22.3/tests/integration/links_test.go (about)

     1  // Copyright 2017 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package integration
     5  
     6  import (
     7  	"fmt"
     8  	"net/http"
     9  	"path"
    10  	"testing"
    11  
    12  	"code.gitea.io/gitea/modules/setting"
    13  	api "code.gitea.io/gitea/modules/structs"
    14  	"code.gitea.io/gitea/modules/test"
    15  	"code.gitea.io/gitea/tests"
    16  
    17  	"github.com/stretchr/testify/assert"
    18  )
    19  
    20  func TestLinksNoLogin(t *testing.T) {
    21  	defer tests.PrepareTestEnv(t)()
    22  
    23  	links := []string{
    24  		"/explore/repos",
    25  		"/explore/repos?q=test",
    26  		"/explore/users",
    27  		"/explore/users?q=test",
    28  		"/explore/organizations",
    29  		"/explore/organizations?q=test",
    30  		"/",
    31  		"/user/sign_up",
    32  		"/user/login",
    33  		"/user/forgot_password",
    34  		"/api/swagger",
    35  		"/user2/repo1",
    36  		"/user2/repo1/",
    37  		"/user2/repo1/projects",
    38  		"/user2/repo1/projects/1",
    39  		"/user2/repo1/releases/tag/delete-tag", // It's the only one existing record on release.yml which has is_tag: true
    40  		"/assets/img/404.png",
    41  		"/assets/img/500.png",
    42  		"/.well-known/security.txt",
    43  	}
    44  
    45  	for _, link := range links {
    46  		req := NewRequest(t, "GET", link)
    47  		MakeRequest(t, req, http.StatusOK)
    48  	}
    49  }
    50  
    51  func TestRedirectsNoLogin(t *testing.T) {
    52  	defer tests.PrepareTestEnv(t)()
    53  
    54  	redirects := map[string]string{
    55  		"/user2/repo1/commits/master":                "/user2/repo1/commits/branch/master",
    56  		"/user2/repo1/src/master":                    "/user2/repo1/src/branch/master",
    57  		"/user2/repo1/src/master/file.txt":           "/user2/repo1/src/branch/master/file.txt",
    58  		"/user2/repo1/src/master/directory/file.txt": "/user2/repo1/src/branch/master/directory/file.txt",
    59  		"/user/avatar/Ghost/-1":                      "/assets/img/avatar_default.png",
    60  		"/api/v1/swagger":                            "/api/swagger",
    61  	}
    62  	for link, redirectLink := range redirects {
    63  		req := NewRequest(t, "GET", link)
    64  		resp := MakeRequest(t, req, http.StatusSeeOther)
    65  		assert.EqualValues(t, path.Join(setting.AppSubURL, redirectLink), test.RedirectURL(resp))
    66  	}
    67  }
    68  
    69  func TestNoLoginNotExist(t *testing.T) {
    70  	defer tests.PrepareTestEnv(t)()
    71  
    72  	links := []string{
    73  		"/user5/repo4/projects",
    74  		"/user5/repo4/projects/3",
    75  	}
    76  
    77  	for _, link := range links {
    78  		req := NewRequest(t, "GET", link)
    79  		MakeRequest(t, req, http.StatusNotFound)
    80  	}
    81  }
    82  
    83  func testLinksAsUser(userName string, t *testing.T) {
    84  	links := []string{
    85  		"/explore/repos",
    86  		"/explore/repos?q=test",
    87  		"/explore/users",
    88  		"/explore/users?q=test",
    89  		"/explore/organizations",
    90  		"/explore/organizations?q=test",
    91  		"/",
    92  		"/user/forgot_password",
    93  		"/api/swagger",
    94  		"/issues",
    95  		"/issues?type=your_repositories&repos=[0]&sort=&state=open",
    96  		"/issues?type=assigned&repos=[0]&sort=&state=open",
    97  		"/issues?type=your_repositories&repos=[0]&sort=&state=closed",
    98  		"/issues?type=assigned&repos=[]&sort=&state=closed",
    99  		"/issues?type=assigned&sort=&state=open",
   100  		"/issues?type=created_by&repos=[1,2]&sort=&state=closed",
   101  		"/issues?type=created_by&repos=[1,2]&sort=&state=open",
   102  		"/pulls",
   103  		"/pulls?type=your_repositories&repos=[2]&sort=&state=open",
   104  		"/pulls?type=assigned&repos=[]&sort=&state=open",
   105  		"/pulls?type=created_by&repos=[0]&sort=&state=open",
   106  		"/pulls?type=your_repositories&repos=[0]&sort=&state=closed",
   107  		"/pulls?type=assigned&repos=[0]&sort=&state=closed",
   108  		"/pulls?type=created_by&repos=[0]&sort=&state=closed",
   109  		"/milestones",
   110  		"/milestones?sort=mostcomplete&state=closed",
   111  		"/milestones?type=your_repositories&sort=mostcomplete&state=closed",
   112  		"/milestones?sort=&repos=[1]&state=closed",
   113  		"/milestones?sort=&repos=[1]&state=open",
   114  		"/milestones?repos=[0]&sort=mostissues&state=open",
   115  		"/notifications",
   116  		"/repo/create",
   117  		"/repo/migrate",
   118  		"/org/create",
   119  		"/user2",
   120  		"/user2?tab=stars",
   121  		"/user2?tab=activity",
   122  		"/user/settings",
   123  		"/user/settings/account",
   124  		"/user/settings/security",
   125  		"/user/settings/security/two_factor/enroll",
   126  		"/user/settings/keys",
   127  		"/user/settings/organization",
   128  		"/user/settings/repos",
   129  	}
   130  
   131  	session := loginUser(t, userName)
   132  	for _, link := range links {
   133  		req := NewRequest(t, "GET", link)
   134  		session.MakeRequest(t, req, http.StatusOK)
   135  	}
   136  
   137  	reqAPI := NewRequestf(t, "GET", "/api/v1/users/%s/repos", userName)
   138  	respAPI := MakeRequest(t, reqAPI, http.StatusOK)
   139  
   140  	var apiRepos []*api.Repository
   141  	DecodeJSON(t, respAPI, &apiRepos)
   142  
   143  	repoLinks := []string{
   144  		"",
   145  		"/issues",
   146  		"/pulls",
   147  		"/commits/branch/master",
   148  		"/graph",
   149  		"/settings",
   150  		"/settings/collaboration",
   151  		"/settings/branches",
   152  		"/settings/hooks",
   153  		// FIXME: below links should return 200 but 404 ??
   154  		//"/settings/hooks/git",
   155  		//"/settings/hooks/git/pre-receive",
   156  		//"/settings/hooks/git/update",
   157  		//"/settings/hooks/git/post-receive",
   158  		"/settings/keys",
   159  		"/releases",
   160  		"/releases/new",
   161  		//"/wiki/_pages",
   162  		"/wiki/?action=_new",
   163  		"/activity",
   164  	}
   165  
   166  	for _, repo := range apiRepos {
   167  		for _, link := range repoLinks {
   168  			req := NewRequest(t, "GET", fmt.Sprintf("/%s/%s%s", userName, repo.Name, link))
   169  			session.MakeRequest(t, req, http.StatusOK)
   170  		}
   171  	}
   172  }
   173  
   174  func TestLinksLogin(t *testing.T) {
   175  	defer tests.PrepareTestEnv(t)()
   176  
   177  	testLinksAsUser("user2", t)
   178  }
   179  
   180  func TestRepoLinks(t *testing.T) {
   181  	defer tests.PrepareTestEnv(t)()
   182  
   183  	// repo1 has enabled almost features, so we can test most links
   184  	repoLink := "/user2/repo1"
   185  	links := []string{
   186  		"/actions",
   187  		"/packages",
   188  		"/projects",
   189  	}
   190  
   191  	// anonymous user
   192  	for _, link := range links {
   193  		req := NewRequest(t, "GET", repoLink+link)
   194  		MakeRequest(t, req, http.StatusOK)
   195  	}
   196  
   197  	// admin/owner user
   198  	session := loginUser(t, "user1")
   199  	for _, link := range links {
   200  		req := NewRequest(t, "GET", repoLink+link)
   201  		session.MakeRequest(t, req, http.StatusOK)
   202  	}
   203  
   204  	// non-admin non-owner user
   205  	session = loginUser(t, "user2")
   206  	for _, link := range links {
   207  		req := NewRequest(t, "GET", repoLink+link)
   208  		session.MakeRequest(t, req, http.StatusOK)
   209  	}
   210  }