github.com/livermorium/go-swagger@v0.19.0/scan/classifier_test.go (about) 1 // Copyright 2015 go-swagger maintainers 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package scan 16 17 import ( 18 gobuild "go/build" 19 goparser "go/parser" 20 "log" 21 "path/filepath" 22 "sort" 23 "testing" 24 25 "golang.org/x/tools/go/loader" 26 27 "github.com/stretchr/testify/assert" 28 ) 29 30 func TestAnnotationMatcher(t *testing.T) { 31 variations := []string{ 32 "// swagger", 33 " swagger", 34 "swagger", 35 " * swagger", 36 } 37 known := []string{ 38 "meta", 39 "route", 40 "model", 41 "parameters", 42 "strfmt", 43 "response", 44 "enum", 45 "default", 46 } 47 48 for _, variation := range variations { 49 for _, tpe := range known { 50 assert.True(t, rxSwaggerAnnotation.MatchString(variation+":"+tpe)) 51 } 52 } 53 } 54 55 func classifierProgram() *loader.Program { 56 var ldr loader.Config 57 ldr.ParserMode = goparser.ParseComments 58 ldr.Build = &gobuild.Default 59 ldr.ImportWithTests("github.com/go-swagger/go-swagger/fixtures/goparsing/classification") 60 ldr.ImportWithTests("github.com/go-swagger/go-swagger/fixtures/goparsing/classification/models") 61 ldr.ImportWithTests("github.com/go-swagger/go-swagger/fixtures/goparsing/classification/operations") 62 prog, err := ldr.Load() 63 if err != nil { 64 log.Fatal(err) 65 } 66 return prog 67 } 68 69 func petstoreProgram() *loader.Program { 70 var ldr loader.Config 71 ldr.ParserMode = goparser.ParseComments 72 ldr.Build = &gobuild.Default 73 ldr.ImportWithTests("github.com/go-swagger/go-swagger/fixtures/goparsing/petstore") 74 ldr.ImportWithTests("github.com/go-swagger/go-swagger/fixtures/goparsing/petstore/models") 75 ldr.ImportWithTests("github.com/go-swagger/go-swagger/fixtures/goparsing/petstore/rest/handlers") 76 prog, err := ldr.Load() 77 if err != nil { 78 log.Fatal(err) 79 } 80 return prog 81 } 82 83 func invalidProgram(name string) *loader.Program { 84 var ldr loader.Config 85 ldr.ParserMode = goparser.ParseComments 86 ldr.ImportWithTests("github.com/go-swagger/go-swagger/fixtures/goparsing/" + name) 87 prog, err := ldr.Load() 88 if err != nil { 89 log.Fatal(err) 90 } 91 return prog 92 } 93 94 func testInvalidProgram(t testing.TB, name string) bool { 95 prog := invalidProgram(name) 96 classifier := &programClassifier{} 97 _, err := classifier.Classify(prog) 98 return assert.Error(t, err) 99 } 100 101 func TestDuplicateAnnotations(t *testing.T) { 102 for _, b := range []string{"model_param", "param_model", "model_response", "response_model"} { 103 testInvalidProgram(t, "invalid_"+b) 104 } 105 } 106 107 func TestClassifier(t *testing.T) { 108 109 prog := petstoreProgram() 110 classifier := &programClassifier{} 111 classified, err := classifier.Classify(prog) 112 assert.NoError(t, err) 113 114 // ensure all the dependencies are there 115 assert.Len(t, classified.Meta, 1) 116 assert.Len(t, classified.Routes, 2) 117 118 var fNames []string 119 for _, file := range classified.Models { 120 fNames = append( 121 fNames, 122 filepath.Base(prog.Fset.File(file.Pos()).Name())) 123 } 124 125 sort.Sort(sort.StringSlice(fNames)) 126 assert.EqualValues(t, []string{"order.go", "pet.go", "tag.go", "user.go"}, fNames) 127 } 128 129 func TestClassifierInclude(t *testing.T) { 130 131 prog := classificationProg 132 classifier := &programClassifier{ 133 Includes: packageFilters([]packageFilter{ 134 {Name: "github.com/go-swagger/go-swagger/fixtures/goparsing/classification"}, 135 {Name: "github.com/go-swagger/go-swagger/fixtures/goparsing/classification/transitive/mods"}, 136 {Name: "github.com/go-swagger/go-swagger/fixtures/goparsing/classification/operations"}, 137 {Name: "github.com/go-swagger/go-swagger/fixtures/goparsing/classification/operations_annotation"}, 138 }), 139 } 140 classified, err := classifier.Classify(prog) 141 assert.NoError(t, err) 142 143 // ensure all the dependencies are there 144 assert.Len(t, classified.Meta, 1) 145 assert.Len(t, classified.Routes, 1) 146 147 //var fNames []string 148 //for _, file := range classified.Models { 149 //fNames = append( 150 //fNames, 151 //filepath.Base(prog.Fset.File(file.Pos()).Name())) 152 //} 153 154 //sort.Sort(sort.StringSlice(fNames)) 155 //assert.EqualValues(t, []string{"pet.go"}, fNames) 156 } 157 158 func TestClassifierExclude(t *testing.T) { 159 160 prog := classificationProg 161 classifier := &programClassifier{ 162 Excludes: packageFilters([]packageFilter{ 163 {Name: "github.com/go-swagger/go-swagger/fixtures/goparsing/classification/transitive/mods"}, 164 }), 165 } 166 classified, err := classifier.Classify(prog) 167 assert.NoError(t, err) 168 169 // ensure all the dependencies are there 170 assert.Len(t, classified.Meta, 1) 171 assert.Len(t, classified.Routes, 1) 172 173 //var fNames []string 174 //for _, file := range classified.Models { 175 //fNames = append( 176 //fNames, 177 //filepath.Base(prog.Fset.File(file.Pos()).Name())) 178 //} 179 180 //sort.Sort(sort.StringSlice(fNames)) 181 //assert.EqualValues(t, []string{"order.go", "user.go"}, fNames) 182 }