github.com/go-swagger/go-swagger@v0.31.0/generator/media_test.go (about)

     1  package generator
     2  
     3  import (
     4  	"sort"
     5  	"testing"
     6  
     7  	"github.com/go-openapi/runtime"
     8  	"github.com/stretchr/testify/assert"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func TestMediaWellKnownMime(t *testing.T) {
    13  	w, ok := wellKnownMime(runtime.JSONMime)
    14  	assert.True(t, ok)
    15  	assert.Equal(t, jsonSerializer, w)
    16  
    17  	w, ok = wellKnownMime(runtime.YAMLMime)
    18  	assert.True(t, ok)
    19  	assert.Equal(t, "yaml", w)
    20  
    21  	w, ok = wellKnownMime(runtime.JSONMime + "+version=1;param=1")
    22  	assert.True(t, ok)
    23  	assert.Equal(t, jsonSerializer, w)
    24  
    25  	w, ok = wellKnownMime("unknown")
    26  	assert.False(t, ok)
    27  	assert.Equal(t, "", w)
    28  }
    29  
    30  func TestMediaMime(t *testing.T) {
    31  	params := "param=1;param=2"
    32  	withParams := runtime.JSONMime + ";" + params
    33  	assert.Equal(t, runtime.JSONMime, mediaMime(runtime.JSONMime))
    34  	assert.Equal(t, runtime.JSONMime, mediaMime(withParams))
    35  
    36  	assert.Equal(t, params, mediaParameters(withParams))
    37  	assert.Equal(t, "", mediaParameters(runtime.JSONMime))
    38  }
    39  
    40  func TestMediaGoName(t *testing.T) {
    41  	assert.Equal(t, "StarStar", mediaGoName("*/*"))
    42  }
    43  
    44  func TestMediaMakeSerializers(t *testing.T) {
    45  	app := appGenerator{
    46  		Name:     "myapp",
    47  		Receiver: "myReceiver",
    48  	}
    49  
    50  	res, supportsJSON := app.makeSerializers([]string{
    51  		runtime.JSONMime,
    52  		"application/json;param=1",
    53  		"application/json;param=2",
    54  		"application/json",
    55  		"application/json+subtype;param=6",
    56  		"application/yaml;param=1",
    57  		runtime.YAMLMime,
    58  		runtime.YAMLMime + "; param=xy",
    59  		runtime.YAMLMime + ";  param=xy", // duplicate
    60  		"application/funny;param=x",
    61  	}, func(media string) (string, bool) {
    62  		w, ok := knownConsumers[media]
    63  		if !ok {
    64  			w = "custom.FunnyConsume()"
    65  		}
    66  		return w, true
    67  	})
    68  	assert.True(t, supportsJSON)
    69  	assert.True(t, sort.IsSorted(res))
    70  	assert.Len(t, res, 3)
    71  
    72  	for _, ser := range res {
    73  		assert.NotEmpty(t, ser.AppName)
    74  		assert.NotEmpty(t, ser.ReceiverName)
    75  		assert.NotEmpty(t, ser.Implementation)
    76  
    77  		switch ser.Name {
    78  		case jsonSerializer:
    79  			assert.Len(t, ser.AllSerializers, 2)
    80  			for _, media := range ser.AllSerializers {
    81  				assert.Equal(t, ser.AppName, media.AppName)
    82  				assert.Equal(t, ser.ReceiverName, media.ReceiverName)
    83  				assert.Equal(t, ser.Implementation, media.Implementation)
    84  				switch media.MediaType {
    85  				case "application/json":
    86  					assert.Len(t, media.Parameters, 2)
    87  				case "application/json+subtype":
    88  					assert.Len(t, media.Parameters, 1)
    89  				default:
    90  					t.Logf("unexpected media type: %s in %v", media.MediaType, ser.AllSerializers)
    91  					t.Fail()
    92  				}
    93  			}
    94  
    95  		case "yaml":
    96  			assert.Len(t, ser.AllSerializers, 2)
    97  			for _, media := range ser.AllSerializers {
    98  				assert.Equal(t, ser.AppName, media.AppName)
    99  				assert.Equal(t, ser.ReceiverName, media.ReceiverName)
   100  				assert.Equal(t, ser.Implementation, media.Implementation)
   101  				switch media.MediaType {
   102  				case runtime.YAMLMime:
   103  					assert.Len(t, media.Parameters, 1)
   104  				case "application/yaml":
   105  					assert.Len(t, media.Parameters, 1)
   106  				default:
   107  					t.Logf("unexpected media type: %s in %v", media.MediaType, ser.AllSerializers)
   108  					t.Fail()
   109  				}
   110  			}
   111  
   112  		case "applicationFunny":
   113  			assert.Len(t, ser.AllSerializers, 1)
   114  			for _, media := range ser.AllSerializers {
   115  				assert.Equal(t, ser.AppName, media.AppName)
   116  				assert.Equal(t, ser.ReceiverName, media.ReceiverName)
   117  				assert.Equal(t, ser.Implementation, media.Implementation)
   118  				switch media.MediaType {
   119  				case "application/funny":
   120  					assert.Len(t, media.Parameters, 1)
   121  				default:
   122  					t.Logf("unexpected media type: %s in %v", media.MediaType, ser.AllSerializers)
   123  					t.Fail()
   124  				}
   125  			}
   126  		default:
   127  			t.Logf("unexpected serializer name: %s", ser.Name)
   128  			t.Fail()
   129  		}
   130  	}
   131  
   132  	// no json, one non default serializer
   133  	res, supportsJSON = app.makeSerializers([]string{
   134  		"application/yaml",
   135  		runtime.TextMime,
   136  		"application/funny",
   137  	}, func(media string) (string, bool) {
   138  		w, ok := knownConsumers[media]
   139  		return w, ok
   140  	})
   141  	assert.False(t, supportsJSON)
   142  	assert.True(t, sort.IsSorted(res))
   143  	assert.Len(t, res, 3)
   144  	for _, ser := range res {
   145  		assert.NotEmpty(t, ser.AppName)
   146  		assert.NotEmpty(t, ser.ReceiverName)
   147  		switch ser.Name {
   148  		case "yaml":
   149  			assert.NotEmpty(t, ser.Implementation)
   150  			assert.Len(t, ser.AllSerializers, 1)
   151  		case "txt":
   152  			assert.NotEmpty(t, ser.Implementation)
   153  			assert.Len(t, ser.AllSerializers, 1)
   154  		case "applicationFunny":
   155  			assert.Empty(t, ser.Implementation)
   156  			assert.Len(t, ser.AllSerializers, 1)
   157  		default:
   158  			t.Logf("unexpected mime type: %s", ser.MediaType)
   159  			t.Fail()
   160  		}
   161  	}
   162  
   163  	// empty: defaults as json
   164  	res, supportsJSON = app.makeSerializers([]string{}, func(_ string) (string, bool) { return "fake", true })
   165  	assert.True(t, supportsJSON)
   166  	assert.True(t, sort.IsSorted(res))
   167  	require.Len(t, res, 1)
   168  	assert.Equal(t, jsonSerializer, res[0].Name)
   169  }