forked from loafle/openapi-generator-original
* [Go][Client] Ensure test errors don't crash Previously we did not interrupt execution of a test case when an error was returned from an API call. This was causing the tests to crash as soon as we try to dereference the response. We now fail the tests as soon as the first API error is received. * [Go][Client] Use configured Scheme and Host in requests Previously we were simply setting the Host header and completely ignoring the configured scheme.
298 lines
7.3 KiB
Go
298 lines
7.3 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/antihax/optional"
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
sw "./go-petstore"
|
|
)
|
|
|
|
var client *sw.APIClient
|
|
|
|
const testHost = "petstore.swagger.io:80"
|
|
const testScheme = "http"
|
|
|
|
func TestMain(m *testing.M) {
|
|
cfg := sw.NewConfiguration()
|
|
cfg.AddDefaultHeader("testheader", "testvalue")
|
|
cfg.Host = testHost
|
|
cfg.Scheme = testScheme
|
|
client = sw.NewAPIClient(cfg)
|
|
retCode := m.Run()
|
|
os.Exit(retCode)
|
|
}
|
|
|
|
func TestAddPet(t *testing.T) {
|
|
newPet := (sw.Pet{Id: 12830, Name: "gopher",
|
|
PhotoUrls: []string{"http://1.com", "http://2.com"}, Status: "pending", Tags: []sw.Tag{sw.Tag{Id: 1, Name: "tag2"}}})
|
|
|
|
r, err := client.PetApi.AddPet(context.Background(), newPet)
|
|
|
|
if err != nil {
|
|
t.Fatalf("Error while adding pet: %v", err)
|
|
}
|
|
if r.StatusCode != 200 {
|
|
t.Log(r)
|
|
}
|
|
}
|
|
|
|
func TestFindPetsByStatusWithMissingParam(t *testing.T) {
|
|
_, r, err := client.PetApi.FindPetsByStatus(context.Background(), nil)
|
|
|
|
if err != nil {
|
|
t.Fatalf("Error while testing TestFindPetsByStatusWithMissingParam: %v", err)
|
|
}
|
|
if r.StatusCode != 200 {
|
|
t.Log(r)
|
|
}
|
|
}
|
|
|
|
func TestGetPetById(t *testing.T) {
|
|
isPetCorrect(t, 12830, "gopher", "pending")
|
|
}
|
|
|
|
func TestGetPetByIdWithInvalidID(t *testing.T) {
|
|
resp, r, err := client.PetApi.GetPetById(context.Background(), 999999999)
|
|
if r != nil && r.StatusCode == 404 {
|
|
assertedError, ok := err.(sw.GenericOpenAPIError)
|
|
a := assert.New(t)
|
|
a.True(ok)
|
|
a.Contains(string(assertedError.Body()), "type")
|
|
|
|
a.Contains(assertedError.Error(), "Not Found")
|
|
} else if err != nil {
|
|
t.Fatalf("Error while getting pet by invalid id: %v", err)
|
|
t.Log(r)
|
|
} else {
|
|
t.Log(resp)
|
|
}
|
|
}
|
|
|
|
func TestUpdatePetWithForm(t *testing.T) {
|
|
r, err := client.PetApi.UpdatePetWithForm(context.Background(), 12830, &sw.UpdatePetWithFormOpts{
|
|
Name: optional.NewString("golang"),
|
|
Status: optional.NewString("available"),
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("Error while updating pet by id: %v", err)
|
|
t.Log(r)
|
|
}
|
|
if r.StatusCode != 200 {
|
|
t.Log(r)
|
|
}
|
|
|
|
// get the pet with id 12830 from server to verify the update
|
|
isPetCorrect(t, 12830, "golang", "available")
|
|
}
|
|
|
|
func TestFindPetsByTag(t *testing.T) {
|
|
var found = false
|
|
resp, r, err := client.PetApi.FindPetsByTags(context.Background(), []string{"tag2"})
|
|
if err != nil {
|
|
t.Fatalf("Error while getting pet by tag: %v", err)
|
|
t.Log(r)
|
|
} else {
|
|
if len(resp) == 0 {
|
|
t.Errorf("Error no pets returned")
|
|
} else {
|
|
|
|
assert := assert.New(t)
|
|
for i := 0; i < len(resp); i++ {
|
|
if resp[i].Id == 12830 {
|
|
assert.Equal(resp[i].Status, "available", "Pet status should be `pending`")
|
|
found = true
|
|
}
|
|
}
|
|
}
|
|
|
|
if found == false {
|
|
t.Errorf("Error while getting pet by tag could not find 12830")
|
|
}
|
|
|
|
if r.StatusCode != 200 {
|
|
t.Log(r)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestFindPetsByStatus(t *testing.T) {
|
|
resp, r, err := client.PetApi.FindPetsByStatus(context.Background(), []string{"available"})
|
|
if err != nil {
|
|
t.Fatalf("Error while getting pet by id: %v", err)
|
|
t.Log(r)
|
|
} else {
|
|
if len(resp) == 0 {
|
|
t.Errorf("Error no pets returned")
|
|
} else {
|
|
assert := assert.New(t)
|
|
for i := 0; i < len(resp); i++ {
|
|
assert.Equal(resp[i].Status, "available", "Pet status should be `available`")
|
|
}
|
|
}
|
|
|
|
if r.StatusCode != 200 {
|
|
t.Log(r)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestUploadFile(t *testing.T) {
|
|
file, _ := os.Open("../python/testfiles/foo.png")
|
|
|
|
_, r, err := client.PetApi.UploadFile(context.Background(), 12830, &sw.UploadFileOpts{
|
|
AdditionalMetadata: optional.NewString("golang"),
|
|
File: optional.NewInterface(file),
|
|
})
|
|
|
|
if err != nil {
|
|
t.Fatalf("Error while uploading file: %v", err)
|
|
}
|
|
|
|
if r.StatusCode != 200 {
|
|
t.Log(r)
|
|
}
|
|
}
|
|
|
|
func TestUploadFileRequired(t *testing.T) {
|
|
return // remove when server supports this endpoint
|
|
file, _ := os.Open("../python/testfiles/foo.png")
|
|
|
|
_, r, err := client.PetApi.UploadFileWithRequiredFile(context.Background(), 12830,
|
|
file,
|
|
&sw.UploadFileWithRequiredFileOpts{
|
|
AdditionalMetadata: optional.NewString("golang"),
|
|
})
|
|
|
|
if err != nil {
|
|
t.Fatalf("Error while uploading file: %v", err)
|
|
}
|
|
|
|
if r.StatusCode != 200 {
|
|
t.Log(r)
|
|
}
|
|
}
|
|
|
|
func TestDeletePet(t *testing.T) {
|
|
r, err := client.PetApi.DeletePet(context.Background(), 12830, nil)
|
|
|
|
if err != nil {
|
|
t.Fatalf("Error while deleting pet by id: %v", err)
|
|
}
|
|
if r.StatusCode != 200 {
|
|
t.Log(r)
|
|
}
|
|
}
|
|
|
|
/*
|
|
// Test we can concurrently create, retrieve, update, and delete.
|
|
func TestConcurrency(t *testing.T) {
|
|
errc := make(chan error)
|
|
|
|
newPets := []sw.Pet{
|
|
sw.Pet{Id: 912345, Name: "gopherFred", PhotoUrls: []string{"http://1.com", "http://2.com"}, Status: "pending"},
|
|
sw.Pet{Id: 912346, Name: "gopherDan", PhotoUrls: []string{"http://1.com", "http://2.com"}, Status: "active"},
|
|
sw.Pet{Id: 912347, Name: "gopherRick", PhotoUrls: []string{"http://1.com", "http://2.com"}, Status: "mia"},
|
|
sw.Pet{Id: 912348, Name: "gopherJohn", PhotoUrls: []string{"http://1.com", "http://2.com"}, Status: "active"},
|
|
sw.Pet{Id: 912349, Name: "gopherAlf", PhotoUrls: []string{"http://1.com", "http://2.com"}, Status: "pending"},
|
|
sw.Pet{Id: 912350, Name: "gopherRob", PhotoUrls: []string{"http://1.com", "http://2.com"}, Status: "pending"},
|
|
sw.Pet{Id: 912351, Name: "gopherIan", PhotoUrls: []string{"http://1.com", "http://2.com"}, Status: "active"},
|
|
}
|
|
|
|
// Add the pets.
|
|
for _, pet := range newPets {
|
|
go func(newPet sw.Pet) {
|
|
r, err := client.PetApi.AddPet(nil, newPet)
|
|
if r.StatusCode != 200 {
|
|
t.Log(r)
|
|
}
|
|
errc <- err
|
|
}(pet)
|
|
}
|
|
waitOnFunctions(t, errc, len(newPets))
|
|
|
|
// Verify they are correct.
|
|
for _, pet := range newPets {
|
|
go func(pet sw.Pet) {
|
|
isPetCorrect(t, pet.Id, pet.Name, pet.Status)
|
|
errc <- nil
|
|
}(pet)
|
|
}
|
|
|
|
waitOnFunctions(t, errc, len(newPets))
|
|
|
|
// Update all to active with the name gopherDan
|
|
for _, pet := range newPets {
|
|
go func(id int64) {
|
|
r, err := client.PetApi.UpdatePet(nil, sw.Pet{Id: (int64)(id), Name: "gopherDan", PhotoUrls: []string{"http://1.com", "http://2.com"}, Status: "active"})
|
|
if r.StatusCode != 200 {
|
|
t.Log(r)
|
|
}
|
|
errc <- err
|
|
}(pet.Id)
|
|
}
|
|
waitOnFunctions(t, errc, len(newPets))
|
|
|
|
// Verify they are correct.
|
|
for _, pet := range newPets {
|
|
go func(pet sw.Pet) {
|
|
isPetCorrect(t, pet.Id, "gopherDan", "active")
|
|
errc <- nil
|
|
}(pet)
|
|
}
|
|
|
|
waitOnFunctions(t, errc, len(newPets))
|
|
|
|
// Delete them all.
|
|
for _, pet := range newPets {
|
|
go func(id int64) {
|
|
deletePet(t, (int64)(id))
|
|
errc <- nil
|
|
}(pet.Id)
|
|
}
|
|
waitOnFunctions(t, errc, len(newPets))
|
|
}
|
|
*/
|
|
|
|
func waitOnFunctions(t *testing.T, errc chan error, n int) {
|
|
for i := 0; i < n; i++ {
|
|
err := <-errc
|
|
if err != nil {
|
|
t.Fatalf("Error performing concurrent test: %v", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func deletePet(t *testing.T, id int64) {
|
|
r, err := client.PetApi.DeletePet(context.Background(), id, nil)
|
|
|
|
if err != nil {
|
|
t.Fatalf("Error while deleting pet by id: %v", err)
|
|
}
|
|
if r.StatusCode != 200 {
|
|
t.Log(r)
|
|
}
|
|
}
|
|
|
|
func isPetCorrect(t *testing.T, id int64, name string, status string) {
|
|
assert := assert.New(t)
|
|
resp, r, err := client.PetApi.GetPetById(context.Background(), id)
|
|
if err != nil {
|
|
t.Fatalf("Error while getting pet by id: %v", err)
|
|
} else {
|
|
assert.Equal(resp.Id, int64(id), "Pet id should be equal")
|
|
assert.Equal(resp.Name, name, fmt.Sprintf("Pet name should be %s", name))
|
|
assert.Equal(resp.Status, status, fmt.Sprintf("Pet status should be %s", status))
|
|
|
|
//t.Log(resp)
|
|
}
|
|
if r.StatusCode != 200 {
|
|
t.Log(r)
|
|
}
|
|
}
|
|
|