@@ -50,6 +50,7 @@ import (
5050 "strconv"
5151 "testing"
5252 "time"
53+ "math"
5354
5455 "github.com/godror/godror"
5556 . "github.com/oracle-samples/gorm-oracle/tests/utils"
@@ -480,3 +481,309 @@ func TestGORMValuer(t *testing.T) {
480481 t .Errorf ("generated vars is not equal, got %v" , stmt .Vars )
481482 }
482483}
484+
485+ func TestEncryptedDataScanValue (t * testing.T ) {
486+ var ed EncryptedData
487+
488+ if err := ed .Scan ([]byte ("***mypassword" )); err != nil {
489+ t .Errorf ("expected no error, got %v" , err )
490+ }
491+ if string (ed ) != "mypassword" {
492+ t .Errorf ("expected 'mypassword', got %s" , string (ed ))
493+ }
494+
495+ if err := ed .Scan ("***otherpass" ); err != nil {
496+ t .Errorf ("expected no error, got %v" , err )
497+ }
498+ if string (ed ) != "otherpass" {
499+ t .Errorf ("expected 'otherpass', got %s" , string (ed ))
500+ }
501+
502+ if err := ed .Scan ([]byte ("no" )); err == nil {
503+ t .Errorf ("expected error for too short input" )
504+ }
505+
506+ val , err := EncryptedData ("mypassword" ).Value ()
507+ if err != nil {
508+ t .Errorf ("expected no error, got %v" , err )
509+ }
510+ if string (val .([]byte )) != "***mypassword" {
511+ t .Errorf ("expected '***mypassword', got %s" , string (val .([]byte )))
512+ }
513+
514+ _ , err = EncryptedData ("xpass" ).Value ()
515+ if err == nil {
516+ t .Errorf ("expected error when starting with 'x'" )
517+ }
518+ }
519+
520+ func TestNumScan (t * testing.T ) {
521+ var n Num
522+
523+ if err := n .Scan (int64 (42 )); err != nil {
524+ t .Errorf ("expected no error, got %v" , err )
525+ }
526+ if n != 42 {
527+ t .Errorf ("expected 42, got %d" , n )
528+ }
529+
530+ if err := n .Scan ("99" ); err != nil {
531+ t .Errorf ("expected no error, got %v" , err )
532+ }
533+ if n != 99 {
534+ t .Errorf ("expected 99, got %d" , n )
535+ }
536+
537+ if err := n .Scan ([]byte ("123" )); err != nil {
538+ t .Errorf ("expected no error, got %v" , err )
539+ }
540+ if n != 123 {
541+ t .Errorf ("expected 123, got %d" , n )
542+ }
543+
544+ if err := n .Scan (godror .Number ("456" )); err != nil {
545+ t .Errorf ("expected no error, got %v" , err )
546+ }
547+ if n != 456 {
548+ t .Errorf ("expected 456, got %d" , n )
549+ }
550+
551+ if err := n .Scan (nil ); err != nil {
552+ t .Errorf ("expected no error, got %v" , err )
553+ }
554+ if n != 0 {
555+ t .Errorf ("expected 0 after nil scan, got %d" , n )
556+ }
557+
558+ if err := n .Scan (3.14 ); err == nil {
559+ t .Errorf ("expected error for unsupported type" )
560+ }
561+
562+ if err := n .Scan (int64 (0 )); err != nil {
563+ t .Errorf ("expected no error, got %v" , err )
564+ }
565+ if n != 0 {
566+ t .Errorf ("expected 0, got %d" , n )
567+ }
568+
569+ if err := n .Scan (int64 (- 123 )); err != nil {
570+ t .Errorf ("expected no error, got %v" , err )
571+ }
572+ if n != - 123 {
573+ t .Errorf ("expected -123, got %d" , n )
574+ }
575+
576+ large := int64 (math .MaxInt64 )
577+ if err := n .Scan (large ); err != nil {
578+ t .Errorf ("expected no error for large int, got %v" , err )
579+ }
580+ if n != Num (large ) {
581+ t .Errorf ("expected %d, got %d" , large , n )
582+ }
583+
584+ small := int64 (math .MinInt64 )
585+ if err := n .Scan (small ); err != nil {
586+ t .Errorf ("expected no error for small int, got %v" , err )
587+ }
588+ if n != Num (small ) {
589+ t .Errorf ("expected %d, got %d" , small , n )
590+ }
591+
592+ if err := n .Scan (" 77 " ); err == nil {
593+ t .Errorf ("expected error for spaced string" )
594+ }
595+
596+ if err := n .Scan ("" ); err == nil {
597+ t .Errorf ("expected error for empty string" )
598+ }
599+
600+ if err := n .Scan ([]byte ("" )); err == nil {
601+ t .Errorf ("expected error for empty byte slice" )
602+ }
603+
604+ if err := n .Scan ("not-a-number" ); err == nil {
605+ t .Errorf ("expected error for invalid string" )
606+ }
607+
608+ if err := n .Scan (godror .Number ("abc" )); err == nil {
609+ t .Errorf ("expected error for invalid godror.Number" )
610+ }
611+
612+ if err := n .Scan (uint64 (123 )); err == nil {
613+ t .Errorf ("expected error for unsupported uint64 type" )
614+ }
615+
616+ if err := n .Scan ("9223372036854775808" ); err == nil {
617+ t .Errorf ("expected error for overflow string" )
618+ }
619+
620+ if err := n .Scan (`"42"` ); err == nil {
621+ t .Errorf ("expected error for quoted JSON string" )
622+ }
623+
624+ if err := n .Scan (true ); err == nil {
625+ t .Errorf ("expected error for bool input" )
626+ }
627+ }
628+
629+ func TestStringsSliceScanValue (t * testing.T ) {
630+ original := StringsSlice {"a" , "b" }
631+ val , err := original .Value ()
632+ if err != nil {
633+ t .Errorf ("expected no error, got %v" , err )
634+ }
635+
636+ var parsed StringsSlice
637+ if err := parsed .Scan (val .(string )); err != nil {
638+ t .Errorf ("expected no error, got %v" , err )
639+ }
640+ if len (parsed ) != 2 || parsed [0 ] != "a" || parsed [1 ] != "b" {
641+ t .Errorf ("unexpected parsed result: %#v" , parsed )
642+ }
643+
644+ if err := parsed .Scan (123 ); err == nil {
645+ t .Errorf ("expected error for unsupported type" )
646+ }
647+ }
648+
649+ func TestStructsSliceScanValue (t * testing.T ) {
650+ original := StructsSlice {
651+ {Name : "n1" , Val : "v1" },
652+ {Name : "n2" , Val : "v2" },
653+ }
654+ val , err := original .Value ()
655+ if err != nil {
656+ t .Errorf ("expected no error, got %v" , err )
657+ }
658+
659+ var parsed StructsSlice
660+ if err := parsed .Scan (val .(string )); err != nil {
661+ t .Errorf ("expected no error, got %v" , err )
662+ }
663+ if len (parsed ) != 2 || parsed [0 ].Name != "n1" || parsed [1 ].Val != "v2" {
664+ t .Errorf ("unexpected parsed result: %#v" , parsed )
665+ }
666+ }
667+
668+ func TestExampleStructScanValue (t * testing.T ) {
669+ orig := ExampleStruct {Name : "foo" , Val : "bar" }
670+ val , err := orig .Value ()
671+ if err != nil {
672+ t .Errorf ("expected no error, got %v" , err )
673+ }
674+
675+ var parsed ExampleStruct
676+ if err := parsed .Scan (val .([]byte )); err != nil {
677+ t .Errorf ("expected no error, got %v" , err )
678+ }
679+ if parsed .Val != "bar" {
680+ t .Errorf ("expected Val 'bar', got %s" , parsed .Val )
681+ }
682+
683+ if err := parsed .Scan (123 ); err == nil {
684+ t .Errorf ("expected error for unsupported type" )
685+ }
686+ }
687+
688+ func TestRoleScanValue (t * testing.T ) {
689+ var r Role
690+ if err := r .Scan ([]byte ("admin" )); err != nil {
691+ t .Errorf ("expected no error, got %v" , err )
692+ }
693+ if ! r .IsAdmin () {
694+ t .Errorf ("expected role to be admin" )
695+ }
696+
697+ if err := r .Scan ("user" ); err != nil {
698+ t .Errorf ("expected no error, got %v" , err )
699+ }
700+ if r .IsAdmin () {
701+ t .Errorf ("expected role to be not admin" )
702+ }
703+
704+ val , err := r .Value ()
705+ if err != nil {
706+ t .Errorf ("expected no error, got %v" , err )
707+ }
708+ if val != "user" {
709+ t .Errorf ("expected 'user', got %v" , val )
710+ }
711+ }
712+
713+ func TestEmptyTimeScanValue (t * testing.T ) {
714+ var et EmptyTime
715+ now := time .Now ()
716+ if err := et .Scan (now ); err != nil {
717+ t .Errorf ("expected no error, got %v" , err )
718+ }
719+ if ! et .Time .Equal (now ) {
720+ t .Errorf ("expected %v, got %v" , now , et .Time )
721+ }
722+
723+ val , err := et .Value ()
724+ if err != nil {
725+ t .Errorf ("expected no error, got %v" , err )
726+ }
727+ if _ , ok := val .(time.Time ); ! ok {
728+ t .Errorf ("expected time.Time, got %T" , val )
729+ }
730+ }
731+
732+ func TestStringsSliceEmptySlice (t * testing.T ) {
733+ empty := StringsSlice {}
734+ val , err := empty .Value ()
735+ if err != nil {
736+ t .Errorf ("expected no error for empty slice, got %v" , err )
737+ }
738+
739+ var parsed StringsSlice
740+ if err := parsed .Scan (val .(string )); err != nil {
741+ t .Errorf ("expected no error scanning empty slice, got %v" , err )
742+ }
743+ if len (parsed ) != 0 {
744+ t .Errorf ("expected empty slice, got %#v" , parsed )
745+ }
746+ }
747+
748+ func TestStringsSliceNilSlice (t * testing.T ) {
749+ var nilSlice StringsSlice
750+ val , err := nilSlice .Value ()
751+ if err != nil {
752+ t .Errorf ("expected no error for nil slice, got %v" , err )
753+ }
754+ if val .(string ) != "null" && val .(string ) != "[]" {
755+ t .Errorf ("expected JSON null or [], got %v" , val )
756+ }
757+ }
758+
759+ func TestStringsSliceSpecialCharacters (t * testing.T ) {
760+ special := StringsSlice {"a,b" , "c\n d" , "e\" f" }
761+ val , err := special .Value ()
762+ if err != nil {
763+ t .Errorf ("expected no error, got %v" , err )
764+ }
765+
766+ var parsed StringsSlice
767+ if err := parsed .Scan (val .(string )); err != nil {
768+ t .Errorf ("expected no error scanning special chars, got %v" , err )
769+ }
770+ if parsed [0 ] != "a,b" || parsed [1 ] != "c\n d" || parsed [2 ] != "e\" f" {
771+ t .Errorf ("unexpected parsed result with special chars: %#v" , parsed )
772+ }
773+ }
774+
775+ func TestStringsSliceInvalidJSON (t * testing.T ) {
776+ var parsed StringsSlice
777+ err := parsed .Scan ("{bad json}" )
778+ if err == nil {
779+ t .Errorf ("expected error for malformed JSON, got nil" )
780+ }
781+ }
782+
783+ func TestStringsSliceWrongType (t * testing.T ) {
784+ slice := StringsSlice {"x" }
785+ err := slice .Scan (123 )
786+ if err == nil {
787+ t .Errorf ("expected error for wrong type, got nil" )
788+ }
789+ }
0 commit comments