2018-02-19 22:24:10 +00:00
|
|
|
// Copyright 2018 Drone.IO Inc.
|
2018-03-21 13:02:17 +00:00
|
|
|
//
|
2018-02-19 22:24:10 +00:00
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
2018-03-21 13:02:17 +00:00
|
|
|
//
|
2018-02-19 22:24:10 +00:00
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
2018-03-21 13:02:17 +00:00
|
|
|
//
|
2018-02-19 22:24:10 +00:00
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
2017-07-22 09:12:09 +00:00
|
|
|
package fixtures
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"net/http"
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Handler returns an http.Handler that is capable of handing a variety of mock
|
|
|
|
// Coding requests and returns mock responses.
|
|
|
|
func Handler() http.Handler {
|
|
|
|
gin.SetMode(gin.TestMode)
|
|
|
|
|
|
|
|
e := gin.New()
|
|
|
|
e.POST("/api/oauth/access_token_v2", getToken)
|
|
|
|
e.GET("/api/account/current_user", getUser)
|
|
|
|
e.GET("/api/user/:gk/project/:prj", getProject)
|
|
|
|
e.GET("/api/user/:gk/project/:prj/git", getDepot)
|
|
|
|
e.GET("/api/user/:gk/project/:prj/git/blob/:ref/:path", getFile)
|
|
|
|
e.GET("/api/user/:gk/project/:prj/git/hooks", getHooks)
|
|
|
|
e.POST("/api/user/:gk/project/:prj/git/hook", postHook)
|
|
|
|
e.PUT("/api/user/:gk/project/:prj/git/hook/:id", putHook)
|
|
|
|
e.DELETE("/api/user/:gk/project/:prj/git/hook/:id", deleteHook)
|
|
|
|
|
|
|
|
return e
|
|
|
|
}
|
|
|
|
|
|
|
|
func getToken(c *gin.Context) {
|
|
|
|
c.Header("Content-Type", "application/json;charset=UTF-8")
|
|
|
|
switch c.PostForm("grant_type") {
|
|
|
|
case "refresh_token":
|
|
|
|
switch c.PostForm("refresh_token") {
|
|
|
|
case "i9i0HQqNR8bTY4rALYEF2itayFJNbnzC1eMFppwT":
|
|
|
|
c.String(200, refreshedTokenPayload)
|
|
|
|
default:
|
|
|
|
c.String(200, invalidRefreshTokenPayload)
|
|
|
|
}
|
|
|
|
case "authorization_code":
|
|
|
|
fallthrough
|
|
|
|
default:
|
|
|
|
switch c.PostForm("code") {
|
|
|
|
case "code":
|
|
|
|
c.String(200, tokenPayload)
|
|
|
|
default:
|
|
|
|
c.String(200, invalidCodePayload)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func getUser(c *gin.Context) {
|
|
|
|
c.Header("Content-Type", "application/json;charset=UTF-8")
|
|
|
|
switch c.Query("access_token") {
|
|
|
|
case "KTNF2ALdm3ofbtxLh6IbV95Ro5AKWJUP":
|
|
|
|
c.String(200, userPayload)
|
|
|
|
default:
|
|
|
|
c.String(200, userNotFoundPayload)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func getProject(c *gin.Context) {
|
|
|
|
c.Header("Content-Type", "application/json;charset=UTF-8")
|
|
|
|
switch fmt.Sprintf("%s/%s", c.Param("gk"), c.Param("prj")) {
|
|
|
|
case "demo1/test1":
|
|
|
|
c.String(200, fakeProjectPayload)
|
|
|
|
case "demo1/perm_owner":
|
|
|
|
c.String(200, fakePermOwnerPayload)
|
|
|
|
case "demo1/perm_admin":
|
|
|
|
c.String(200, fakePermAdminPayload)
|
|
|
|
case "demo1/perm_member":
|
|
|
|
c.String(200, fakePermMemberPayload)
|
|
|
|
case "demo1/perm_guest":
|
|
|
|
c.String(200, fakePermGuestPayload)
|
|
|
|
default:
|
|
|
|
c.String(200, projectNotFoundPayload)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func getDepot(c *gin.Context) {
|
|
|
|
c.Header("Content-Type", "application/json;charset=UTF-8")
|
|
|
|
switch fmt.Sprintf("%s/%s", c.Param("gk"), c.Param("prj")) {
|
|
|
|
case "demo1/test1":
|
|
|
|
c.String(200, fakeDepotPayload)
|
|
|
|
default:
|
|
|
|
c.String(200, projectNotFoundPayload)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func getProjects(c *gin.Context) {
|
|
|
|
c.Header("Content-Type", "application/json;charset=UTF-8")
|
|
|
|
c.String(200, fakeProjectsPayload)
|
|
|
|
}
|
|
|
|
|
|
|
|
func getFile(c *gin.Context) {
|
|
|
|
c.Header("Content-Type", "application/json;charset=UTF-8")
|
|
|
|
switch fmt.Sprintf("%s/%s/%s/%s", c.Param("gk"), c.Param("prj"), c.Param("ref"), c.Param("path")) {
|
|
|
|
case "demo1/test1/master/.drone.yml", "demo1/test1/4504a072cc/.drone.yml":
|
|
|
|
c.String(200, fakeFilePayload)
|
|
|
|
default:
|
|
|
|
c.String(200, fileNotFoundPayload)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func getHooks(c *gin.Context) {
|
|
|
|
c.Header("Content-Type", "application/json;charset=UTF-8")
|
|
|
|
c.String(200, fakeHooksPayload)
|
|
|
|
}
|
|
|
|
|
|
|
|
func postHook(c *gin.Context) {
|
|
|
|
c.Header("Content-Type", "application/json;charset=UTF-8")
|
|
|
|
switch c.PostForm("hook_url") {
|
|
|
|
case "http://127.0.0.1":
|
|
|
|
c.String(200, `{"code":0}`)
|
|
|
|
default:
|
|
|
|
c.String(200, `{"code":1}`)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func putHook(c *gin.Context) {
|
|
|
|
c.Header("Content-Type", "application/json;charset=UTF-8")
|
|
|
|
switch c.Param("id") {
|
|
|
|
case "2":
|
|
|
|
c.String(200, `{"code":0}`)
|
|
|
|
default:
|
|
|
|
c.String(200, `{"code":1}`)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func deleteHook(c *gin.Context) {
|
|
|
|
c.Header("Content-Type", "application/json;charset=UTF-8")
|
|
|
|
switch c.Param("id") {
|
|
|
|
case "3":
|
|
|
|
c.String(200, `{"code":0}`)
|
|
|
|
default:
|
|
|
|
c.String(200, `{"code":1}`)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const tokenPayload = `
|
|
|
|
{
|
|
|
|
"access_token":"KTNF2ALdm3ofbtxLh6IbV95Ro5AKWJUP",
|
|
|
|
"refresh_token":"zVtxJrKhNhBcNyqCz1NggNAAmehAxnRO3Z0fXmCp",
|
|
|
|
"expires_in":36000
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const refreshedTokenPayload = `
|
|
|
|
{
|
|
|
|
"access_token":"VDZupx0usVRV4oOd1FCu4xUxgk8SY0TK",
|
|
|
|
"refresh_token":"BenBQq7TWZ7Cp0aUM47nQjTz2QHNmTWcPctB609n",
|
|
|
|
"expires_in":36000
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const invalidRefreshTokenPayload = `
|
|
|
|
{
|
|
|
|
"code":3006,
|
|
|
|
"msg":{
|
|
|
|
"oauth_refresh_token_error":"Token校验失败"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const invalidCodePayload = `
|
|
|
|
{
|
|
|
|
"code":3003,
|
|
|
|
"msg":{
|
|
|
|
"oauth_validate_code_error":"code校验失败"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const userPayload = `
|
|
|
|
{
|
|
|
|
"code":0,
|
|
|
|
"data":{
|
|
|
|
"global_key":"demo1",
|
|
|
|
"email":"demo1@gmail.com",
|
|
|
|
"avatar":"/static/fruit_avatar/Fruit-20.png"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const userNotFoundPayload = `
|
|
|
|
{
|
|
|
|
"code":1,
|
|
|
|
"msg":{
|
|
|
|
"user_not_login":"用户未登录"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const fakeProjectPayload = `
|
|
|
|
{
|
|
|
|
"code":0,
|
|
|
|
"data":{
|
|
|
|
"owner_user_name":"demo1",
|
|
|
|
"name":"test1",
|
|
|
|
"depot_path":"/u/gilala/p/abp/git",
|
|
|
|
"https_url":"https://git.coding.net/demo1/test1.git",
|
|
|
|
"is_public": false,
|
|
|
|
"icon":"/static/project_icon/scenery-5.png",
|
|
|
|
"current_user_role":"owner"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const fakePermOwnerPayload = `
|
|
|
|
{
|
|
|
|
"code":0,
|
|
|
|
"data":{
|
|
|
|
"current_user_role":"owner"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const fakePermAdminPayload = `
|
|
|
|
{
|
|
|
|
"code":0,
|
|
|
|
"data":{
|
|
|
|
"current_user_role":"admin"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const fakePermMemberPayload = `
|
|
|
|
{
|
|
|
|
"code":0,
|
|
|
|
"data":{
|
|
|
|
"current_user_role":"member"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const fakePermGuestPayload = `
|
|
|
|
{
|
|
|
|
"code":0,
|
|
|
|
"data":{
|
|
|
|
"current_user_role":"guest"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const fakeDepotPayload = `
|
|
|
|
{
|
|
|
|
"code":0,
|
|
|
|
"data":{
|
|
|
|
"default_branch":"master"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const projectNotFoundPayload = `
|
|
|
|
{
|
|
|
|
"code":1100,
|
|
|
|
"msg":{
|
|
|
|
"project_not_exists":"项目不存在"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const fakeProjectsPayload = `
|
|
|
|
{
|
|
|
|
"code":0,
|
|
|
|
"data":{
|
|
|
|
"list":{
|
|
|
|
"owner_user_name":"demo1",
|
|
|
|
"name":"test1",
|
|
|
|
"icon":"/static/project_icon/scenery-5.png",
|
|
|
|
},
|
|
|
|
"page":1,
|
|
|
|
"pageSize":1,
|
|
|
|
"totalPage":1,
|
|
|
|
"totalRow":1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const fakeFilePayload = `
|
|
|
|
{
|
|
|
|
"code":0,
|
|
|
|
"data":{
|
|
|
|
"file":{
|
|
|
|
"data":"pipeline:\n test:\n image: golang:1.6\n commands:\n - go test\n"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const fileNotFoundPayload = `
|
|
|
|
{
|
|
|
|
"code":0,
|
|
|
|
"data":{
|
|
|
|
"ref":"master"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const fakeHooksPayload = `
|
|
|
|
{
|
|
|
|
"code":0,
|
|
|
|
"data":[
|
|
|
|
{
|
|
|
|
"id":2,
|
|
|
|
"hook_url":"http://127.0.0.2"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id":3,
|
|
|
|
"hook_url":"http://127.0.0.3"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
`
|