github.com/ffalor/go-swagger@v0.0.0-20231011000038-9f25265ac351/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 TestMediaMakeSerializers(t *testing.T) {
    41  	app := appGenerator{
    42  		Name:     "myapp",
    43  		Receiver: "myReceiver",
    44  	}
    45  
    46  	res, supportsJSON := app.makeSerializers([]string{
    47  		runtime.JSONMime,
    48  		"application/json;param=1",
    49  		"application/json;param=2",
    50  		"application/json",
    51  		"application/json+subtype;param=6",
    52  		"application/yaml;param=1",
    53  		runtime.YAMLMime,
    54  		runtime.YAMLMime + "; param=xy",
    55  		runtime.YAMLMime + ";  param=xy", // duplicate
    56  		"application/funny;param=x",
    57  	}, func(media string) (string, bool) {
    58  		w, ok := knownConsumers[media]
    59  		if !ok {
    60  			w = "custom.FunnyConsume()"
    61  		}
    62  		return w, true
    63  	})
    64  	assert.True(t, supportsJSON)
    65  	assert.True(t, sort.IsSorted(res))
    66  	assert.Len(t, res, 3)
    67  
    68  	for _, ser := range res {
    69  		assert.NotEmpty(t, ser.AppName)
    70  		assert.NotEmpty(t, ser.ReceiverName)
    71  		assert.NotEmpty(t, ser.Implementation)
    72  
    73  		switch ser.Name {
    74  		case jsonSerializer:
    75  			assert.Len(t, ser.AllSerializers, 2)
    76  			for _, media := range ser.AllSerializers {
    77  				assert.Equal(t, ser.AppName, media.AppName)
    78  				assert.Equal(t, ser.ReceiverName, media.ReceiverName)
    79  				assert.Equal(t, ser.Implementation, media.Implementation)
    80  				switch media.MediaType {
    81  				case "application/json":
    82  					assert.Len(t, media.Parameters, 2)
    83  				case "application/json+subtype":
    84  					assert.Len(t, media.Parameters, 1)
    85  				default:
    86  					t.Logf("unexpected media type: %s in %v", media.MediaType, ser.AllSerializers)
    87  					t.Fail()
    88  				}
    89  			}
    90  
    91  		case "yaml":
    92  			assert.Len(t, ser.AllSerializers, 2)
    93  			for _, media := range ser.AllSerializers {
    94  				assert.Equal(t, ser.AppName, media.AppName)
    95  				assert.Equal(t, ser.ReceiverName, media.ReceiverName)
    96  				assert.Equal(t, ser.Implementation, media.Implementation)
    97  				switch media.MediaType {
    98  				case runtime.YAMLMime:
    99  					assert.Len(t, media.Parameters, 1)
   100  				case "application/yaml":
   101  					assert.Len(t, media.Parameters, 1)
   102  				default:
   103  					t.Logf("unexpected media type: %s in %v", media.MediaType, ser.AllSerializers)
   104  					t.Fail()
   105  				}
   106  			}
   107  
   108  		case "applicationFunny":
   109  			assert.Len(t, ser.AllSerializers, 1)
   110  			for _, media := range ser.AllSerializers {
   111  				assert.Equal(t, ser.AppName, media.AppName)
   112  				assert.Equal(t, ser.ReceiverName, media.ReceiverName)
   113  				assert.Equal(t, ser.Implementation, media.Implementation)
   114  				switch media.MediaType {
   115  				case "application/funny":
   116  					assert.Len(t, media.Parameters, 1)
   117  				default:
   118  					t.Logf("unexpected media type: %s in %v", media.MediaType, ser.AllSerializers)
   119  					t.Fail()
   120  				}
   121  			}
   122  		default:
   123  			t.Logf("unexpected serializer name: %s", ser.Name)
   124  			t.Fail()
   125  		}
   126  	}
   127  
   128  	// no json, one non default serializer
   129  	res, supportsJSON = app.makeSerializers([]string{
   130  		"application/yaml",
   131  		runtime.TextMime,
   132  		"application/funny",
   133  	}, func(media string) (string, bool) {
   134  		w, ok := knownConsumers[media]
   135  		return w, ok
   136  	})
   137  	assert.False(t, supportsJSON)
   138  	assert.True(t, sort.IsSorted(res))
   139  	assert.Len(t, res, 3)
   140  	for _, ser := range res {
   141  		assert.NotEmpty(t, ser.AppName)
   142  		assert.NotEmpty(t, ser.ReceiverName)
   143  		switch ser.Name {
   144  		case "yaml":
   145  			assert.NotEmpty(t, ser.Implementation)
   146  			assert.Len(t, ser.AllSerializers, 1)
   147  		case "txt":
   148  			assert.NotEmpty(t, ser.Implementation)
   149  			assert.Len(t, ser.AllSerializers, 1)
   150  		case "applicationFunny":
   151  			assert.Empty(t, ser.Implementation)
   152  			assert.Len(t, ser.AllSerializers, 1)
   153  		default:
   154  			t.Logf("unexpected mime type: %s", ser.MediaType)
   155  			t.Fail()
   156  		}
   157  	}
   158  
   159  	// empty: defaults as json
   160  	res, supportsJSON = app.makeSerializers([]string{}, func(_ string) (string, bool) { return "fake", true })
   161  	assert.True(t, supportsJSON)
   162  	assert.True(t, sort.IsSorted(res))
   163  	require.Len(t, res, 1)
   164  	assert.Equal(t, jsonSerializer, res[0].Name)
   165  }