github.com/snyk/vervet/v3@v3.7.0/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/snyk/vervet/v3"
    10  	"github.com/snyk/vervet/v3/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  		err:   "no matching version",
    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.ExtensionProps, ExtSnykApiStability)
   101  		c.Assert(err, qt.ErrorMatches, `extension "x-snyk-api-stability" not found`)
   102  		c.Assert(IsExtensionNotFound(err), qt.IsTrue)
   103  		version, err := ExtensionString(spec.ExtensionProps, ExtSnykApiVersion)
   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.ExtensionProps, ExtSnykApiVersion)
   112  			c.Assert(err, qt.IsNil)
   113  			c.Assert(versionStr, qt.Equals, expected.version)
   114  		}
   115  	}
   116  }