github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/models/setting_test.go (about) 1 package model 2 3 import ( 4 "database/sql" 5 "testing" 6 7 "github.com/DATA-DOG/go-sqlmock" 8 "github.com/cloudreve/Cloudreve/v3/pkg/cache" 9 "github.com/jinzhu/gorm" 10 "github.com/stretchr/testify/assert" 11 ) 12 13 var mock sqlmock.Sqlmock 14 var mockDB *gorm.DB 15 16 // TestMain 初始化数据库Mock 17 func TestMain(m *testing.M) { 18 var db *sql.DB 19 var err error 20 db, mock, err = sqlmock.New() 21 if err != nil { 22 panic("An error was not expected when opening a stub database connection") 23 } 24 DB, _ = gorm.Open("mysql", db) 25 mockDB = DB 26 defer db.Close() 27 m.Run() 28 } 29 30 func TestGetSettingByType(t *testing.T) { 31 cache.Store = cache.NewMemoStore() 32 asserts := assert.New(t) 33 34 //找到设置时 35 rows := sqlmock.NewRows([]string{"name", "value", "type"}). 36 AddRow("siteName", "Cloudreve", "basic"). 37 AddRow("siteDes", "Something wonderful", "basic") 38 mock.ExpectQuery("^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$").WillReturnRows(rows) 39 settings := GetSettingByType([]string{"basic"}) 40 asserts.Equal(map[string]string{ 41 "siteName": "Cloudreve", 42 "siteDes": "Something wonderful", 43 }, settings) 44 45 rows = sqlmock.NewRows([]string{"name", "value", "type"}). 46 AddRow("siteName", "Cloudreve", "basic"). 47 AddRow("siteDes", "Something wonderful", "basic2") 48 mock.ExpectQuery("^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$").WillReturnRows(rows) 49 settings = GetSettingByType([]string{"basic", "basic2"}) 50 asserts.Equal(map[string]string{ 51 "siteName": "Cloudreve", 52 "siteDes": "Something wonderful", 53 }, settings) 54 55 //找不到 56 rows = sqlmock.NewRows([]string{"name", "value", "type"}) 57 mock.ExpectQuery("^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$").WillReturnRows(rows) 58 settings = GetSettingByType([]string{"basic233"}) 59 asserts.Equal(map[string]string{}, settings) 60 } 61 62 func TestGetSettingByNameWithDefault(t *testing.T) { 63 a := assert.New(t) 64 65 rows := sqlmock.NewRows([]string{"name", "value", "type"}) 66 mock.ExpectQuery("^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$").WillReturnRows(rows) 67 settings := GetSettingByNameWithDefault("123", "123321") 68 a.Equal("123321", settings) 69 } 70 71 func TestGetSettingByNames(t *testing.T) { 72 cache.Store = cache.NewMemoStore() 73 asserts := assert.New(t) 74 75 //找到设置时 76 rows := sqlmock.NewRows([]string{"name", "value", "type"}). 77 AddRow("siteName", "Cloudreve", "basic"). 78 AddRow("siteDes", "Something wonderful", "basic") 79 mock.ExpectQuery("^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$").WillReturnRows(rows) 80 settings := GetSettingByNames("siteName", "siteDes") 81 asserts.Equal(map[string]string{ 82 "siteName": "Cloudreve", 83 "siteDes": "Something wonderful", 84 }, settings) 85 asserts.NoError(mock.ExpectationsWereMet()) 86 87 //找到其中一个设置时 88 rows = sqlmock.NewRows([]string{"name", "value", "type"}). 89 AddRow("siteName2", "Cloudreve", "basic") 90 mock.ExpectQuery("^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$").WillReturnRows(rows) 91 settings = GetSettingByNames("siteName2", "siteDes2333") 92 asserts.Equal(map[string]string{ 93 "siteName2": "Cloudreve", 94 }, settings) 95 asserts.NoError(mock.ExpectationsWereMet()) 96 97 //找不到设置时 98 rows = sqlmock.NewRows([]string{"name", "value", "type"}) 99 mock.ExpectQuery("^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$").WillReturnRows(rows) 100 settings = GetSettingByNames("siteName2333", "siteDes2333") 101 asserts.Equal(map[string]string{}, settings) 102 asserts.NoError(mock.ExpectationsWereMet()) 103 104 // 一个设置命中缓存 105 mock.ExpectQuery("^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$").WithArgs("siteDes2").WillReturnRows(sqlmock.NewRows([]string{"name", "value", "type"}). 106 AddRow("siteDes2", "Cloudreve2", "basic")) 107 settings = GetSettingByNames("siteName", "siteDes2") 108 asserts.Equal(map[string]string{ 109 "siteName": "Cloudreve", 110 "siteDes2": "Cloudreve2", 111 }, settings) 112 asserts.NoError(mock.ExpectationsWereMet()) 113 114 } 115 116 // TestGetSettingByName 测试GetSettingByName 117 func TestGetSettingByName(t *testing.T) { 118 cache.Store = cache.NewMemoStore() 119 asserts := assert.New(t) 120 121 //找到设置时 122 rows := sqlmock.NewRows([]string{"name", "value", "type"}). 123 AddRow("siteName", "Cloudreve", "basic") 124 mock.ExpectQuery("^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$").WillReturnRows(rows) 125 126 siteName := GetSettingByName("siteName") 127 asserts.Equal("Cloudreve", siteName) 128 asserts.NoError(mock.ExpectationsWereMet()) 129 130 // 第二次查询应返回缓存内容 131 siteNameCache := GetSettingByName("siteName") 132 asserts.Equal("Cloudreve", siteNameCache) 133 asserts.NoError(mock.ExpectationsWereMet()) 134 135 // 找不到设置 136 rows = sqlmock.NewRows([]string{"name", "value", "type"}) 137 mock.ExpectQuery("^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$").WillReturnRows(rows) 138 139 siteName = GetSettingByName("siteName not exist") 140 asserts.Equal("", siteName) 141 asserts.NoError(mock.ExpectationsWereMet()) 142 143 } 144 145 func TestIsTrueVal(t *testing.T) { 146 asserts := assert.New(t) 147 148 asserts.True(IsTrueVal("1")) 149 asserts.True(IsTrueVal("true")) 150 asserts.False(IsTrueVal("0")) 151 asserts.False(IsTrueVal("false")) 152 } 153 154 func TestGetSiteURL(t *testing.T) { 155 asserts := assert.New(t) 156 157 // 正常 158 { 159 err := cache.Deletes([]string{"siteURL"}, "setting_") 160 asserts.NoError(err) 161 162 mock.ExpectQuery("SELECT(.+)").WithArgs("siteURL").WillReturnRows(sqlmock.NewRows([]string{"id", "value"}).AddRow(1, "https://drive.cloudreve.org")) 163 siteURL := GetSiteURL() 164 asserts.NoError(mock.ExpectationsWereMet()) 165 asserts.Equal("https://drive.cloudreve.org", siteURL.String()) 166 } 167 168 // 失败 返回默认值 169 { 170 err := cache.Deletes([]string{"siteURL"}, "setting_") 171 asserts.NoError(err) 172 173 mock.ExpectQuery("SELECT(.+)").WithArgs("siteURL").WillReturnRows(sqlmock.NewRows([]string{"id", "value"}).AddRow(1, ":][\\/\\]sdf")) 174 siteURL := GetSiteURL() 175 asserts.NoError(mock.ExpectationsWereMet()) 176 asserts.Equal("https://cloudreve.org", siteURL.String()) 177 } 178 } 179 180 func TestGetIntSetting(t *testing.T) { 181 asserts := assert.New(t) 182 183 // 正常 184 { 185 cache.Set("setting_TestGetIntSetting", "10", 0) 186 res := GetIntSetting("TestGetIntSetting", 20) 187 asserts.Equal(10, res) 188 } 189 190 // 使用默认值 191 { 192 res := GetIntSetting("TestGetIntSetting_2", 20) 193 asserts.Equal(20, res) 194 } 195 196 }