github.com/systematiccaos/gorm@v1.22.6/schema/naming_test.go (about)

     1  package schema
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  )
     7  
     8  func TestToDBName(t *testing.T) {
     9  	var maps = map[string]string{
    10  		"":                          "",
    11  		"x":                         "x",
    12  		"X":                         "x",
    13  		"userRestrictions":          "user_restrictions",
    14  		"ThisIsATest":               "this_is_a_test",
    15  		"PFAndESI":                  "pf_and_esi",
    16  		"AbcAndJkl":                 "abc_and_jkl",
    17  		"EmployeeID":                "employee_id",
    18  		"SKU_ID":                    "sku_id",
    19  		"FieldX":                    "field_x",
    20  		"HTTPAndSMTP":               "http_and_smtp",
    21  		"HTTPServerHandlerForURLID": "http_server_handler_for_url_id",
    22  		"UUID":                      "uuid",
    23  		"HTTPURL":                   "http_url",
    24  		"HTTP_URL":                  "http_url",
    25  		"SHA256Hash":                "sha256_hash",
    26  		"SHA256HASH":                "sha256_hash",
    27  		"ThisIsActuallyATestSoWeMayBeAbleToUseThisCodeInGormPackageAlsoIdCanBeUsedAtTheEndAsID": "this_is_actually_a_test_so_we_may_be_able_to_use_this_code_in_gorm_package_also_id_can_be_used_at_the_end_as_id",
    28  	}
    29  
    30  	ns := NamingStrategy{}
    31  	for key, value := range maps {
    32  		if ns.toDBName(key) != value {
    33  			t.Errorf("%v toName should equal %v, but got %v", key, value, ns.toDBName(key))
    34  		}
    35  	}
    36  
    37  	maps = map[string]string{
    38  		"x":                              "X",
    39  		"user_restrictions":              "UserRestriction",
    40  		"this_is_a_test":                 "ThisIsATest",
    41  		"abc_and_jkl":                    "AbcAndJkl",
    42  		"employee_id":                    "EmployeeID",
    43  		"field_x":                        "FieldX",
    44  		"http_and_smtp":                  "HTTPAndSMTP",
    45  		"http_server_handler_for_url_id": "HTTPServerHandlerForURLID",
    46  		"uuid":                           "UUID",
    47  		"http_url":                       "HTTPURL",
    48  		"sha256_hash":                    "Sha256Hash",
    49  		"this_is_actually_a_test_so_we_may_be_able_to_use_this_code_in_gorm_package_also_id_can_be_used_at_the_end_as_id": "ThisIsActuallyATestSoWeMayBeAbleToUseThisCodeInGormPackageAlsoIDCanBeUsedAtTheEndAsID",
    50  	}
    51  	for key, value := range maps {
    52  		if ns.SchemaName(key) != value {
    53  			t.Errorf("%v schema name should equal %v, but got %v", key, value, ns.SchemaName(key))
    54  		}
    55  	}
    56  }
    57  
    58  func TestNamingStrategy(t *testing.T) {
    59  	var ns = NamingStrategy{
    60  		TablePrefix:   "public.",
    61  		SingularTable: true,
    62  		NameReplacer:  strings.NewReplacer("CID", "Cid"),
    63  	}
    64  	idxName := ns.IndexName("public.table", "name")
    65  
    66  	if idxName != "idx_public_table_name" {
    67  		t.Errorf("invalid index name generated, got %v", idxName)
    68  	}
    69  
    70  	chkName := ns.CheckerName("public.table", "name")
    71  	if chkName != "chk_public_table_name" {
    72  		t.Errorf("invalid checker name generated, got %v", chkName)
    73  	}
    74  
    75  	joinTable := ns.JoinTableName("user_languages")
    76  	if joinTable != "public.user_languages" {
    77  		t.Errorf("invalid join table generated, got %v", joinTable)
    78  	}
    79  
    80  	joinTable2 := ns.JoinTableName("UserLanguage")
    81  	if joinTable2 != "public.user_language" {
    82  		t.Errorf("invalid join table generated, got %v", joinTable2)
    83  	}
    84  
    85  	tableName := ns.TableName("Company")
    86  	if tableName != "public.company" {
    87  		t.Errorf("invalid table name generated, got %v", tableName)
    88  	}
    89  
    90  	columdName := ns.ColumnName("", "NameCID")
    91  	if columdName != "name_cid" {
    92  		t.Errorf("invalid column name generated, got %v", columdName)
    93  	}
    94  }
    95  
    96  type CustomReplacer struct {
    97  	f func(string) string
    98  }
    99  
   100  func (r CustomReplacer) Replace(name string) string {
   101  	return r.f(name)
   102  }
   103  
   104  func TestCustomReplacer(t *testing.T) {
   105  	var ns = NamingStrategy{
   106  		TablePrefix:   "public.",
   107  		SingularTable: true,
   108  		NameReplacer: CustomReplacer{
   109  			func(name string) string {
   110  				replaced := "REPLACED_" + strings.ToUpper(name)
   111  				return strings.NewReplacer("CID", "_Cid").Replace(replaced)
   112  			},
   113  		},
   114  		NoLowerCase: false,
   115  	}
   116  
   117  	idxName := ns.IndexName("public.table", "name")
   118  	if idxName != "idx_public_table_replaced_name" {
   119  		t.Errorf("invalid index name generated, got %v", idxName)
   120  	}
   121  
   122  	chkName := ns.CheckerName("public.table", "name")
   123  	if chkName != "chk_public_table_name" {
   124  		t.Errorf("invalid checker name generated, got %v", chkName)
   125  	}
   126  
   127  	joinTable := ns.JoinTableName("user_languages")
   128  	if joinTable != "public.user_languages" { // Seems like a bug in NamingStrategy to skip the Replacer when the name is lowercase here.
   129  		t.Errorf("invalid join table generated, got %v", joinTable)
   130  	}
   131  
   132  	joinTable2 := ns.JoinTableName("UserLanguage")
   133  	if joinTable2 != "public.replaced_userlanguage" {
   134  		t.Errorf("invalid join table generated, got %v", joinTable2)
   135  	}
   136  
   137  	tableName := ns.TableName("Company")
   138  	if tableName != "public.replaced_company" {
   139  		t.Errorf("invalid table name generated, got %v", tableName)
   140  	}
   141  
   142  	columdName := ns.ColumnName("", "NameCID")
   143  	if columdName != "replaced_name_cid" {
   144  		t.Errorf("invalid column name generated, got %v", columdName)
   145  	}
   146  }
   147  
   148  func TestCustomReplacerWithNoLowerCase(t *testing.T) {
   149  	var ns = NamingStrategy{
   150  		TablePrefix:   "public.",
   151  		SingularTable: true,
   152  		NameReplacer: CustomReplacer{
   153  			func(name string) string {
   154  				replaced := "REPLACED_" + strings.ToUpper(name)
   155  				return strings.NewReplacer("CID", "_Cid").Replace(replaced)
   156  			},
   157  		},
   158  		NoLowerCase: true,
   159  	}
   160  
   161  	idxName := ns.IndexName("public.table", "name")
   162  	if idxName != "idx_public_table_REPLACED_NAME" {
   163  		t.Errorf("invalid index name generated, got %v", idxName)
   164  	}
   165  
   166  	chkName := ns.CheckerName("public.table", "name")
   167  	if chkName != "chk_public_table_name" {
   168  		t.Errorf("invalid checker name generated, got %v", chkName)
   169  	}
   170  
   171  	joinTable := ns.JoinTableName("user_languages")
   172  	if joinTable != "public.REPLACED_USER_LANGUAGES" {
   173  		t.Errorf("invalid join table generated, got %v", joinTable)
   174  	}
   175  
   176  	joinTable2 := ns.JoinTableName("UserLanguage")
   177  	if joinTable2 != "public.REPLACED_USERLANGUAGE" {
   178  		t.Errorf("invalid join table generated, got %v", joinTable2)
   179  	}
   180  
   181  	tableName := ns.TableName("Company")
   182  	if tableName != "public.REPLACED_COMPANY" {
   183  		t.Errorf("invalid table name generated, got %v", tableName)
   184  	}
   185  
   186  	columdName := ns.ColumnName("", "NameCID")
   187  	if columdName != "REPLACED_NAME_Cid" {
   188  		t.Errorf("invalid column name generated, got %v", columdName)
   189  	}
   190  }
   191  
   192  func TestFormatNameWithStringLongerThan64Characters(t *testing.T) {
   193  	var ns = NamingStrategy{}
   194  
   195  	formattedName := ns.formatName("prefix", "table", "thisIsAVeryVeryVeryVeryVeryVeryVeryVeryVeryLongString")
   196  	if formattedName != "prefixtablethisIsAVeryVeryVeryVeryVeryVeryVeryVeryVeryLo180f2c67" {
   197  		t.Errorf("invalid formatted name generated, got %v", formattedName)
   198  	}
   199  }