@@ -50,6 +50,7 @@ import (
50
50
"strconv"
51
51
"testing"
52
52
"time"
53
+ "math"
53
54
54
55
"github.com/godror/godror"
55
56
. "github.com/oracle-samples/gorm-oracle/tests/utils"
@@ -480,3 +481,309 @@ func TestGORMValuer(t *testing.T) {
480
481
t .Errorf ("generated vars is not equal, got %v" , stmt .Vars )
481
482
}
482
483
}
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