@ -1,11 +1,15 @@
package parser
package gogen
import (
goformat "go/format"
"io/ioutil"
"os"
"path/filepath"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/tal-tech/go-zero/tools/goctl/api/parser"
)
const testApiTemplate = `
@ -137,13 +141,50 @@ service A-api {
}
`
const apiJwt = `
type Request struct {
Name string ` + " ` " + `path:" name , options = you | me "` + " ` " + `
}
type Response struct {
Message string ` + " ` " + `json:" message "` + " ` " + `
}
@ server (
jwt : Auth
)
service A - api {
@ handler GreetHandler
get / greet / from / : name ( Request ) returns ( Response )
}
`
const apiJwtWithMiddleware = `
type Request struct {
Name string ` + " ` " + `path:" name , options = you | me "` + " ` " + `
}
type Response struct {
Message string ` + " ` " + `json:" message "` + " ` " + `
}
@ server (
jwt : Auth
middleware : TokenValidate
)
service A - api {
@ handler GreetHandler
get / greet / from / : name ( Request ) returns ( Response )
}
`
func TestParser ( t * testing . T ) {
filename := "greet.api"
err := ioutil . WriteFile ( filename , [ ] byte ( testApiTemplate ) , os . ModePerm )
assert . Nil ( t , err )
defer os . Remove ( filename )
parser , err := NewParser ( filename )
parser , err := parser . NewParser ( filename )
assert . Nil ( t , err )
api , err := parser . Parse ( )
@ -157,6 +198,8 @@ func TestParser(t *testing.T) {
assert . Equal ( t , api . Service . Routes [ 1 ] . RequestType . Name , "Request" )
assert . Equal ( t , api . Service . Routes [ 1 ] . ResponseType . Name , "" )
validate ( t , filename )
}
func TestMultiService ( t * testing . T ) {
@ -165,7 +208,7 @@ func TestMultiService(t *testing.T) {
assert . Nil ( t , err )
defer os . Remove ( filename )
parser , err := NewParser ( filename )
parser , err := parser . NewParser ( filename )
assert . Nil ( t , err )
api , err := parser . Parse ( )
@ -173,6 +216,8 @@ func TestMultiService(t *testing.T) {
assert . Equal ( t , len ( api . Service . Routes ) , 2 )
assert . Equal ( t , len ( api . Service . Groups ) , 2 )
validate ( t , filename )
}
func TestApiNoInfo ( t * testing . T ) {
@ -181,11 +226,13 @@ func TestApiNoInfo(t *testing.T) {
assert . Nil ( t , err )
defer os . Remove ( filename )
parser , err := NewParser ( filename )
parser , err := parser . NewParser ( filename )
assert . Nil ( t , err )
_ , err = parser . Parse ( )
assert . Nil ( t , err )
validate ( t , filename )
}
func TestInvalidApiFile ( t * testing . T ) {
@ -194,7 +241,7 @@ func TestInvalidApiFile(t *testing.T) {
assert . Nil ( t , err )
defer os . Remove ( filename )
parser , err := NewParser ( filename )
parser , err := parser . NewParser ( filename )
assert . Nil ( t , err )
_ , err = parser . Parse ( )
@ -207,7 +254,7 @@ func TestAnonymousAnnotation(t *testing.T) {
assert . Nil ( t , err )
defer os . Remove ( filename )
parser , err := NewParser ( filename )
parser , err := parser . NewParser ( filename )
assert . Nil ( t , err )
api , err := parser . Parse ( )
@ -215,6 +262,8 @@ func TestAnonymousAnnotation(t *testing.T) {
assert . Equal ( t , len ( api . Service . Routes ) , 1 )
assert . Equal ( t , api . Service . Routes [ 0 ] . Annotations [ 0 ] . Value , "GreetHandler" )
validate ( t , filename )
}
func TestApiHasMiddleware ( t * testing . T ) {
@ -223,9 +272,61 @@ func TestApiHasMiddleware(t *testing.T) {
assert . Nil ( t , err )
defer os . Remove ( filename )
parser , err := NewParser ( filename )
parser , err := parser . NewParser ( filename )
assert . Nil ( t , err )
_ , err = parser . Parse ( )
assert . Nil ( t , err )
validate ( t , filename )
}
func TestApiHasJwt ( t * testing . T ) {
filename := "jwt.api"
err := ioutil . WriteFile ( filename , [ ] byte ( apiJwt ) , os . ModePerm )
assert . Nil ( t , err )
defer os . Remove ( filename )
parser , err := parser . NewParser ( filename )
assert . Nil ( t , err )
_ , err = parser . Parse ( )
assert . Nil ( t , err )
validate ( t , filename )
}
func TestApiHasJwtAndMiddleware ( t * testing . T ) {
filename := "jwt.api"
err := ioutil . WriteFile ( filename , [ ] byte ( apiJwtWithMiddleware ) , os . ModePerm )
assert . Nil ( t , err )
defer os . Remove ( filename )
parser , err := parser . NewParser ( filename )
assert . Nil ( t , err )
_ , err = parser . Parse ( )
assert . Nil ( t , err )
validate ( t , filename )
}
func validate ( t * testing . T , api string ) {
dir := "_go"
err := DoGenProject ( api , dir , true )
defer os . RemoveAll ( dir )
assert . Nil ( t , err )
filepath . Walk ( dir , func ( path string , info os . FileInfo , err error ) error {
if strings . HasSuffix ( path , ".go" ) {
code , err := ioutil . ReadFile ( path )
assert . Nil ( t , err )
assert . Nil ( t , validateCode ( string ( code ) ) )
}
return nil
} )
}
func validateCode ( code string ) error {
_ , err := goformat . Source ( [ ] byte ( code ) )
return err
}