github.com/eliastor/durgaform@v0.0.0-20220816172711-d0ab2d17673e/internal/lang/funcs/encoding_test.go (about)

     1  package funcs
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/eliastor/durgaform/internal/lang/marks"
     8  	"github.com/zclconf/go-cty/cty"
     9  )
    10  
    11  func TestBase64Decode(t *testing.T) {
    12  	tests := []struct {
    13  		String cty.Value
    14  		Want   cty.Value
    15  		Err    bool
    16  	}{
    17  		{
    18  			cty.StringVal("YWJjMTIzIT8kKiYoKSctPUB+"),
    19  			cty.StringVal("abc123!?$*&()'-=@~"),
    20  			false,
    21  		},
    22  		{
    23  			cty.StringVal("YWJjMTIzIT8kKiYoKSctPUB+").Mark(marks.Sensitive),
    24  			cty.StringVal("abc123!?$*&()'-=@~").Mark(marks.Sensitive),
    25  			false,
    26  		},
    27  		{ // Invalid base64 data decoding
    28  			cty.StringVal("this-is-an-invalid-base64-data"),
    29  			cty.UnknownVal(cty.String),
    30  			true,
    31  		},
    32  		{ // Invalid utf-8
    33  			cty.StringVal("\xc3\x28"),
    34  			cty.UnknownVal(cty.String),
    35  			true,
    36  		},
    37  	}
    38  
    39  	for _, test := range tests {
    40  		t.Run(fmt.Sprintf("base64decode(%#v)", test.String), func(t *testing.T) {
    41  			got, err := Base64Decode(test.String)
    42  
    43  			if test.Err {
    44  				if err == nil {
    45  					t.Fatal("succeeded; want error")
    46  				}
    47  				return
    48  			} else if err != nil {
    49  				t.Fatalf("unexpected error: %s", err)
    50  			}
    51  
    52  			if !got.RawEquals(test.Want) {
    53  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
    54  			}
    55  		})
    56  	}
    57  }
    58  
    59  func TestBase64Decode_error(t *testing.T) {
    60  	tests := map[string]struct {
    61  		String  cty.Value
    62  		WantErr string
    63  	}{
    64  		"invalid base64": {
    65  			cty.StringVal("dfg"),
    66  			`failed to decode base64 data "dfg"`,
    67  		},
    68  		"sensitive invalid base64": {
    69  			cty.StringVal("dfg").Mark(marks.Sensitive),
    70  			`failed to decode base64 data (sensitive value)`,
    71  		},
    72  		"invalid utf-8": {
    73  			cty.StringVal("whee"),
    74  			"the result of decoding the provided string is not valid UTF-8",
    75  		},
    76  	}
    77  
    78  	for name, test := range tests {
    79  		t.Run(name, func(t *testing.T) {
    80  			_, err := Base64Decode(test.String)
    81  
    82  			if err == nil {
    83  				t.Fatal("succeeded; want error")
    84  			}
    85  
    86  			if err.Error() != test.WantErr {
    87  				t.Errorf("wrong error result\ngot:  %#v\nwant: %#v", err.Error(), test.WantErr)
    88  			}
    89  		})
    90  	}
    91  }
    92  
    93  func TestBase64Encode(t *testing.T) {
    94  	tests := []struct {
    95  		String cty.Value
    96  		Want   cty.Value
    97  		Err    bool
    98  	}{
    99  		{
   100  			cty.StringVal("abc123!?$*&()'-=@~"),
   101  			cty.StringVal("YWJjMTIzIT8kKiYoKSctPUB+"),
   102  			false,
   103  		},
   104  	}
   105  
   106  	for _, test := range tests {
   107  		t.Run(fmt.Sprintf("base64encode(%#v)", test.String), func(t *testing.T) {
   108  			got, err := Base64Encode(test.String)
   109  
   110  			if test.Err {
   111  				if err == nil {
   112  					t.Fatal("succeeded; want error")
   113  				}
   114  				return
   115  			} else if err != nil {
   116  				t.Fatalf("unexpected error: %s", err)
   117  			}
   118  
   119  			if !got.RawEquals(test.Want) {
   120  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   121  			}
   122  		})
   123  	}
   124  }
   125  
   126  func TestBase64Gzip(t *testing.T) {
   127  	tests := []struct {
   128  		String cty.Value
   129  		Want   cty.Value
   130  		Err    bool
   131  	}{
   132  		{
   133  			cty.StringVal("test"),
   134  			cty.StringVal("H4sIAAAAAAAA/ypJLS4BAAAA//8BAAD//wx+f9gEAAAA"),
   135  			false,
   136  		},
   137  	}
   138  
   139  	for _, test := range tests {
   140  		t.Run(fmt.Sprintf("base64gzip(%#v)", test.String), func(t *testing.T) {
   141  			got, err := Base64Gzip(test.String)
   142  
   143  			if test.Err {
   144  				if err == nil {
   145  					t.Fatal("succeeded; want error")
   146  				}
   147  				return
   148  			} else if err != nil {
   149  				t.Fatalf("unexpected error: %s", err)
   150  			}
   151  
   152  			if !got.RawEquals(test.Want) {
   153  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   154  			}
   155  		})
   156  	}
   157  }
   158  
   159  func TestURLEncode(t *testing.T) {
   160  	tests := []struct {
   161  		String cty.Value
   162  		Want   cty.Value
   163  		Err    bool
   164  	}{
   165  		{
   166  			cty.StringVal("abc123-_"),
   167  			cty.StringVal("abc123-_"),
   168  			false,
   169  		},
   170  		{
   171  			cty.StringVal("foo:bar@localhost?foo=bar&bar=baz"),
   172  			cty.StringVal("foo%3Abar%40localhost%3Ffoo%3Dbar%26bar%3Dbaz"),
   173  			false,
   174  		},
   175  		{
   176  			cty.StringVal("mailto:email?subject=this+is+my+subject"),
   177  			cty.StringVal("mailto%3Aemail%3Fsubject%3Dthis%2Bis%2Bmy%2Bsubject"),
   178  			false,
   179  		},
   180  		{
   181  			cty.StringVal("foo/bar"),
   182  			cty.StringVal("foo%2Fbar"),
   183  			false,
   184  		},
   185  	}
   186  
   187  	for _, test := range tests {
   188  		t.Run(fmt.Sprintf("urlencode(%#v)", test.String), func(t *testing.T) {
   189  			got, err := URLEncode(test.String)
   190  
   191  			if test.Err {
   192  				if err == nil {
   193  					t.Fatal("succeeded; want error")
   194  				}
   195  				return
   196  			} else if err != nil {
   197  				t.Fatalf("unexpected error: %s", err)
   198  			}
   199  
   200  			if !got.RawEquals(test.Want) {
   201  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   202  			}
   203  		})
   204  	}
   205  }
   206  
   207  func TestBase64TextEncode(t *testing.T) {
   208  	tests := []struct {
   209  		String   cty.Value
   210  		Encoding cty.Value
   211  		Want     cty.Value
   212  		Err      string
   213  	}{
   214  		{
   215  			cty.StringVal("abc123!?$*&()'-=@~"),
   216  			cty.StringVal("UTF-8"),
   217  			cty.StringVal("YWJjMTIzIT8kKiYoKSctPUB+"),
   218  			``,
   219  		},
   220  		{
   221  			cty.StringVal("abc123!?$*&()'-=@~"),
   222  			cty.StringVal("UTF-16LE"),
   223  			cty.StringVal("YQBiAGMAMQAyADMAIQA/ACQAKgAmACgAKQAnAC0APQBAAH4A"),
   224  			``,
   225  		},
   226  		{
   227  			cty.StringVal("abc123!?$*&()'-=@~"),
   228  			cty.StringVal("CP936"),
   229  			cty.StringVal("YWJjMTIzIT8kKiYoKSctPUB+"),
   230  			``,
   231  		},
   232  		{
   233  			cty.StringVal("abc123!?$*&()'-=@~"),
   234  			cty.StringVal("NOT-EXISTS"),
   235  			cty.UnknownVal(cty.String),
   236  			`"NOT-EXISTS" is not a supported IANA encoding name or alias in this Durgaform version`,
   237  		},
   238  		{
   239  			cty.StringVal("🤔"),
   240  			cty.StringVal("cp437"),
   241  			cty.UnknownVal(cty.String),
   242  			`the given string contains characters that cannot be represented in IBM437`,
   243  		},
   244  		{
   245  			cty.UnknownVal(cty.String),
   246  			cty.StringVal("windows-1250"),
   247  			cty.UnknownVal(cty.String),
   248  			``,
   249  		},
   250  		{
   251  			cty.StringVal("hello world"),
   252  			cty.UnknownVal(cty.String),
   253  			cty.UnknownVal(cty.String),
   254  			``,
   255  		},
   256  	}
   257  
   258  	for _, test := range tests {
   259  		t.Run(fmt.Sprintf("textencodebase64(%#v, %#v)", test.String, test.Encoding), func(t *testing.T) {
   260  			got, err := TextEncodeBase64(test.String, test.Encoding)
   261  
   262  			if test.Err != "" {
   263  				if err == nil {
   264  					t.Fatal("succeeded; want error")
   265  				}
   266  				if got, want := err.Error(), test.Err; got != want {
   267  					t.Fatalf("wrong error\ngot:  %s\nwant: %s", got, want)
   268  				}
   269  				return
   270  			} else if err != nil {
   271  				t.Fatalf("unexpected error: %s", err)
   272  			}
   273  
   274  			if !got.RawEquals(test.Want) {
   275  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   276  			}
   277  		})
   278  	}
   279  }
   280  
   281  func TestBase64TextDecode(t *testing.T) {
   282  	tests := []struct {
   283  		String   cty.Value
   284  		Encoding cty.Value
   285  		Want     cty.Value
   286  		Err      string
   287  	}{
   288  		{
   289  			cty.StringVal("YWJjMTIzIT8kKiYoKSctPUB+"),
   290  			cty.StringVal("UTF-8"),
   291  			cty.StringVal("abc123!?$*&()'-=@~"),
   292  			``,
   293  		},
   294  		{
   295  			cty.StringVal("YQBiAGMAMQAyADMAIQA/ACQAKgAmACgAKQAnAC0APQBAAH4A"),
   296  			cty.StringVal("UTF-16LE"),
   297  			cty.StringVal("abc123!?$*&()'-=@~"),
   298  			``,
   299  		},
   300  		{
   301  			cty.StringVal("YWJjMTIzIT8kKiYoKSctPUB+"),
   302  			cty.StringVal("CP936"),
   303  			cty.StringVal("abc123!?$*&()'-=@~"),
   304  			``,
   305  		},
   306  		{
   307  			cty.StringVal("doesn't matter"),
   308  			cty.StringVal("NOT-EXISTS"),
   309  			cty.UnknownVal(cty.String),
   310  			`"NOT-EXISTS" is not a supported IANA encoding name or alias in this Durgaform version`,
   311  		},
   312  		{
   313  			cty.StringVal("<invalid base64>"),
   314  			cty.StringVal("cp437"),
   315  			cty.UnknownVal(cty.String),
   316  			`the given value is has an invalid base64 symbol at offset 0`,
   317  		},
   318  		{
   319  			cty.StringVal("gQ=="), // this is 0x81, which is not defined in windows-1250
   320  			cty.StringVal("windows-1250"),
   321  			cty.StringVal("�"),
   322  			`the given string contains symbols that are not defined for windows-1250`,
   323  		},
   324  		{
   325  			cty.UnknownVal(cty.String),
   326  			cty.StringVal("windows-1250"),
   327  			cty.UnknownVal(cty.String),
   328  			``,
   329  		},
   330  		{
   331  			cty.StringVal("YQBiAGMAMQAyADMAIQA/ACQAKgAmACgAKQAnAC0APQBAAH4A"),
   332  			cty.UnknownVal(cty.String),
   333  			cty.UnknownVal(cty.String),
   334  			``,
   335  		},
   336  	}
   337  
   338  	for _, test := range tests {
   339  		t.Run(fmt.Sprintf("textdecodebase64(%#v, %#v)", test.String, test.Encoding), func(t *testing.T) {
   340  			got, err := TextDecodeBase64(test.String, test.Encoding)
   341  
   342  			if test.Err != "" {
   343  				if err == nil {
   344  					t.Fatal("succeeded; want error")
   345  				}
   346  				if got, want := err.Error(), test.Err; got != want {
   347  					t.Fatalf("wrong error\ngot:  %s\nwant: %s", got, want)
   348  				}
   349  				return
   350  			} else if err != nil {
   351  				t.Fatalf("unexpected error: %s", err)
   352  			}
   353  
   354  			if !got.RawEquals(test.Want) {
   355  				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
   356  			}
   357  		})
   358  	}
   359  }