github.com/w3security/vervet/v5@v5.3.1-0.20230618081846-5bd9b5d799dc/spec_test.go (about) 1 package vervet_test 2 3 import ( 4 "testing" 5 6 qt "github.com/frankban/quicktest" 7 "github.com/getkin/kin-openapi/openapi3" 8 9 . "github.com/w3security/vervet/v5" 10 "github.com/w3security/vervet/v5/testdata" 11 ) 12 13 func TestSpecs(t *testing.T) { 14 c := qt.New(t) 15 specs, err := LoadSpecVersions(testdata.Path("resources")) 16 c.Assert(err, qt.IsNil) 17 versions := specs.Versions() 18 c.Assert(versions, qt.ContentEquals, VersionSlice{ 19 MustParseVersion("2021-06-01~experimental"), 20 MustParseVersion("2021-06-04~experimental"), 21 MustParseVersion("2021-06-07~experimental"), 22 MustParseVersion("2021-06-13~experimental"), 23 MustParseVersion("2021-06-13~beta"), 24 MustParseVersion("2021-08-20~experimental"), 25 MustParseVersion("2021-08-20~beta"), 26 }) 27 28 type expectResourceVersion struct { 29 version string 30 path string 31 opFunc func(*openapi3.PathItem) *openapi3.Operation 32 } 33 tests := []struct { 34 query, match string 35 hasVersions []expectResourceVersion 36 err string 37 }{{ 38 query: "2021-07-01~experimental", 39 match: "2021-06-13~experimental", 40 hasVersions: []expectResourceVersion{{ 41 version: "2021-06-13~beta", 42 path: "/examples/hello-world", 43 opFunc: func(p *openapi3.PathItem) *openapi3.Operation { return p.Post }, 44 }, { 45 version: "2021-06-13~beta", 46 path: "/examples/hello-world/{id}", 47 opFunc: func(p *openapi3.PathItem) *openapi3.Operation { return p.Get }, 48 }, { 49 version: "2021-06-04~experimental", 50 path: "/orgs/{orgId}/projects", 51 opFunc: func(p *openapi3.PathItem) *openapi3.Operation { return p.Get }, 52 }}, 53 }, { 54 query: "2021-09-01~experimental", 55 match: "2021-08-20~experimental", 56 hasVersions: []expectResourceVersion{{ 57 version: "2021-06-13~beta", 58 path: "/examples/hello-world", 59 opFunc: func(p *openapi3.PathItem) *openapi3.Operation { return p.Post }, 60 }, { 61 version: "2021-06-13~beta", 62 path: "/examples/hello-world/{id}", 63 opFunc: func(p *openapi3.PathItem) *openapi3.Operation { return p.Get }, 64 }, { 65 version: "2021-06-04~experimental", 66 path: "/orgs/{orgId}/projects", 67 opFunc: func(p *openapi3.PathItem) *openapi3.Operation { return p.Get }, 68 }, { 69 version: "2021-08-20~experimental", 70 path: "/orgs/{org_id}/projects/{project_id}", 71 opFunc: func(p *openapi3.PathItem) *openapi3.Operation { return p.Delete }, 72 }}, 73 }, { 74 query: "2021-07-01~wip", 75 match: "2021-06-13~experimental", 76 }, { 77 query: "2021-06-01", 78 err: "no matching version", 79 }, { 80 query: "2021-07-01~beta", 81 match: "2021-06-13~beta", 82 hasVersions: []expectResourceVersion{{ 83 version: "2021-06-13~beta", 84 path: "/examples/hello-world", 85 opFunc: func(p *openapi3.PathItem) *openapi3.Operation { return p.Post }, 86 }, { 87 version: "2021-06-13~beta", 88 path: "/examples/hello-world/{id}", 89 opFunc: func(p *openapi3.PathItem) *openapi3.Operation { return p.Get }, 90 }}, 91 }} 92 for i, t := range tests { 93 c.Logf("test#%d: %#v", i, t) 94 spec, err := specs.At(MustParseVersion(t.query)) 95 if t.err != "" { 96 c.Assert(err, qt.ErrorMatches, t.err) 97 continue 98 } 99 c.Assert(err, qt.IsNil) 100 _, err = ExtensionString(spec.Extensions, ExtW3SecurityApiStability) 101 c.Assert(err, qt.ErrorMatches, `extension "x-w3security-api-stability" not found`) 102 c.Assert(IsExtensionNotFound(err), qt.IsTrue) 103 version, err := ExtensionString(spec.Extensions, ExtW3SecurityApiVersion) 104 c.Assert(err, qt.IsNil) 105 c.Assert(version, qt.Equals, t.match) 106 for _, expected := range t.hasVersions { 107 pathItem := spec.Paths[expected.path] 108 c.Assert(pathItem, qt.Not(qt.IsNil)) 109 op := expected.opFunc(pathItem) 110 c.Assert(op, qt.Not(qt.IsNil)) 111 versionStr, err := ExtensionString(op.Extensions, ExtW3SecurityApiVersion) 112 c.Assert(err, qt.IsNil) 113 c.Assert(versionStr, qt.Equals, expected.version) 114 } 115 } 116 }