| 
									
										
										
										
											2023-05-16 15:08:45 +02:00
										 |  |  | package util | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"net/http" | 
					
						
							|  |  |  | 	"net/http/httptest" | 
					
						
							|  |  |  | 	"strings" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/gin-gonic/gin" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-27 14:00:57 +00:00
										 |  |  | type testMIMES []string | 
					
						
							| 
									
										
										
										
											2023-05-16 15:08:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (tm testMIMES) String(t *testing.T) string { | 
					
						
							|  |  |  | 	t.Helper() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	res := tm.StringS(t) | 
					
						
							|  |  |  | 	return strings.Join(res, ",") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (tm testMIMES) StringS(t *testing.T) []string { | 
					
						
							|  |  |  | 	t.Helper() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	res := make([]string, 0, len(tm)) | 
					
						
							|  |  |  | 	for _, m := range tm { | 
					
						
							|  |  |  | 		res = append(res, string(m)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return res | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestNegotiateFormat(t *testing.T) { | 
					
						
							|  |  |  | 	tests := []struct { | 
					
						
							|  |  |  | 		incoming []string | 
					
						
							|  |  |  | 		offered  testMIMES | 
					
						
							|  |  |  | 		format   string | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{incoming: testMIMES{AppJSON}.StringS(t), offered: testMIMES{AppJRDJSON, AppJSON}, format: "application/json"}, | 
					
						
							|  |  |  | 		{incoming: testMIMES{AppJRDJSON}.StringS(t), offered: testMIMES{AppJRDJSON, AppJSON}, format: "application/jrd+json"}, | 
					
						
							|  |  |  | 		{incoming: testMIMES{AppJRDJSON, AppJSON}.StringS(t), offered: testMIMES{AppJRDJSON}, format: "application/jrd+json"}, | 
					
						
							|  |  |  | 		{incoming: testMIMES{AppJRDJSON, AppJSON}.StringS(t), offered: testMIMES{AppJSON}, format: "application/json"}, | 
					
						
							|  |  |  | 		{incoming: testMIMES{"text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8"}.StringS(t), offered: testMIMES{AppJSON, AppXML}, format: "application/xml"}, | 
					
						
							|  |  |  | 		{incoming: testMIMES{"text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8"}.StringS(t), offered: testMIMES{TextHTML, AppXML}, format: "text/html"}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, tt := range tests { | 
					
						
							|  |  |  | 		name := "incoming:" + strings.Join(tt.incoming, ",") + " offered:" + tt.offered.String(t) | 
					
						
							|  |  |  | 		t.Run(name, func(t *testing.T) { | 
					
						
							|  |  |  | 			tt := tt | 
					
						
							|  |  |  | 			t.Parallel() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			c, _ := gin.CreateTestContext(httptest.NewRecorder()) | 
					
						
							|  |  |  | 			c.Request = &http.Request{ | 
					
						
							|  |  |  | 				Header: make(http.Header), | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			for _, header := range tt.incoming { | 
					
						
							|  |  |  | 				c.Request.Header.Add("accept", header) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			format := NegotiateFormat(c, tt.offered.StringS(t)...) | 
					
						
							|  |  |  | 			if tt.format != format { | 
					
						
							|  |  |  | 				t.Fatalf("expected format: '%s', got format: '%s'", tt.format, format) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |