package model
import (
"database/sql"
"testing"
"github.com/DATA-DOG/go-sqlmock"
"github.com/cloudreve/Cloudreve/v3/pkg/cache"
"github.com/jinzhu/gorm"
"github.com/stretchr/testify/assert"
)
var mock sqlmock . Sqlmock
var mockDB * gorm . DB
// TestMain 初始化数据库Mock
func TestMain ( m * testing . M ) {
var db * sql . DB
var err error
db , mock , err = sqlmock . New ( )
if err != nil {
panic ( "An error was not expected when opening a stub database connection" )
}
DB , _ = gorm . Open ( "mysql" , db )
mockDB = DB
defer db . Close ( )
m . Run ( )
}
func TestGetSettingByType ( t * testing . T ) {
cache . Store = cache . NewMemoStore ( )
asserts := assert . New ( t )
//找到设置时
rows := sqlmock . NewRows ( [ ] string { "name" , "value" , "type" } ) .
AddRow ( "siteName" , "Cloudreve" , "basic" ) .
AddRow ( "siteDes" , "Something wonderful" , "basic" )
mock . ExpectQuery ( "^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$" ) . WillReturnRows ( rows )
settings := GetSettingByType ( [ ] string { "basic" } )
asserts . Equal ( map [ string ] string {
"siteName" : "Cloudreve" ,
"siteDes" : "Something wonderful" ,
} , settings )
rows = sqlmock . NewRows ( [ ] string { "name" , "value" , "type" } ) .
AddRow ( "siteName" , "Cloudreve" , "basic" ) .
AddRow ( "siteDes" , "Something wonderful" , "basic2" )
mock . ExpectQuery ( "^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$" ) . WillReturnRows ( rows )
settings = GetSettingByType ( [ ] string { "basic" , "basic2" } )
asserts . Equal ( map [ string ] string {
"siteName" : "Cloudreve" ,
"siteDes" : "Something wonderful" ,
} , settings )
//找不到
rows = sqlmock . NewRows ( [ ] string { "name" , "value" , "type" } )
mock . ExpectQuery ( "^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$" ) . WillReturnRows ( rows )
settings = GetSettingByType ( [ ] string { "basic233" } )
asserts . Equal ( map [ string ] string { } , settings )
}
func TestGetSettingByNameWithDefault ( t * testing . T ) {
a := assert . New ( t )
rows := sqlmock . NewRows ( [ ] string { "name" , "value" , "type" } )
mock . ExpectQuery ( "^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$" ) . WillReturnRows ( rows )
settings := GetSettingByNameWithDefault ( "123" , "123321" )
a . Equal ( "123321" , settings )
}
func TestGetSettingByNames ( t * testing . T ) {
cache . Store = cache . NewMemoStore ( )
asserts := assert . New ( t )
//找到设置时
rows := sqlmock . NewRows ( [ ] string { "name" , "value" , "type" } ) .
AddRow ( "siteName" , "Cloudreve" , "basic" ) .
AddRow ( "siteDes" , "Something wonderful" , "basic" )
mock . ExpectQuery ( "^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$" ) . WillReturnRows ( rows )
settings := GetSettingByNames ( "siteName" , "siteDes" )
asserts . Equal ( map [ string ] string {
"siteName" : "Cloudreve" ,
"siteDes" : "Something wonderful" ,
} , settings )
asserts . NoError ( mock . ExpectationsWereMet ( ) )
//找到其中一个设置时
rows = sqlmock . NewRows ( [ ] string { "name" , "value" , "type" } ) .
AddRow ( "siteName2" , "Cloudreve" , "basic" )
mock . ExpectQuery ( "^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$" ) . WillReturnRows ( rows )
settings = GetSettingByNames ( "siteName2" , "siteDes2333" )
asserts . Equal ( map [ string ] string {
"siteName2" : "Cloudreve" ,
} , settings )
asserts . NoError ( mock . ExpectationsWereMet ( ) )
//找不到设置时
rows = sqlmock . NewRows ( [ ] string { "name" , "value" , "type" } )
mock . ExpectQuery ( "^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$" ) . WillReturnRows ( rows )
settings = GetSettingByNames ( "siteName2333" , "siteDes2333" )
asserts . Equal ( map [ string ] string { } , settings )
asserts . NoError ( mock . ExpectationsWereMet ( ) )
// 一个设置命中缓存
mock . ExpectQuery ( "^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$" ) . WithArgs ( "siteDes2" ) . WillReturnRows ( sqlmock . NewRows ( [ ] string { "name" , "value" , "type" } ) .
AddRow ( "siteDes2" , "Cloudreve2" , "basic" ) )
settings = GetSettingByNames ( "siteName" , "siteDes2" )
asserts . Equal ( map [ string ] string {
"siteName" : "Cloudreve" ,
"siteDes2" : "Cloudreve2" ,
} , settings )
asserts . NoError ( mock . ExpectationsWereMet ( ) )
}
// TestGetSettingByName 测试GetSettingByName
func TestGetSettingByName ( t * testing . T ) {
cache . Store = cache . NewMemoStore ( )
asserts := assert . New ( t )
//找到设置时
rows := sqlmock . NewRows ( [ ] string { "name" , "value" , "type" } ) .
AddRow ( "siteName" , "Cloudreve" , "basic" )
mock . ExpectQuery ( "^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$" ) . WillReturnRows ( rows )
siteName := GetSettingByName ( "siteName" )
asserts . Equal ( "Cloudreve" , siteName )
asserts . NoError ( mock . ExpectationsWereMet ( ) )
// 第二次查询应返回缓存内容
siteNameCache := GetSettingByName ( "siteName" )
asserts . Equal ( "Cloudreve" , siteNameCache )
asserts . NoError ( mock . ExpectationsWereMet ( ) )
// 找不到设置
rows = sqlmock . NewRows ( [ ] string { "name" , "value" , "type" } )
mock . ExpectQuery ( "^SELECT \\* FROM `(.+)` WHERE `(.+)`\\.`deleted_at` IS NULL AND(.+)$" ) . WillReturnRows ( rows )
siteName = GetSettingByName ( "siteName not exist" )
asserts . Equal ( "" , siteName )
asserts . NoError ( mock . ExpectationsWereMet ( ) )
}
func TestIsTrueVal ( t * testing . T ) {
asserts := assert . New ( t )
asserts . True ( IsTrueVal ( "1" ) )
asserts . True ( IsTrueVal ( "true" ) )
asserts . False ( IsTrueVal ( "0" ) )
asserts . False ( IsTrueVal ( "false" ) )
}
func TestGetSiteURL ( t * testing . T ) {
asserts := assert . New ( t )
// 正常
{
err := cache . Deletes ( [ ] string { "siteURL" } , "setting_" )
asserts . NoError ( err )
mock . ExpectQuery ( "SELECT(.+)" ) . WithArgs ( "siteURL" ) . WillReturnRows ( sqlmock . NewRows ( [ ] string { "id" , "value" } ) . AddRow ( 1 , "https://drive.cloudreve.org" ) )
siteURL := GetSiteURL ( )
asserts . NoError ( mock . ExpectationsWereMet ( ) )
asserts . Equal ( "https://drive.cloudreve.org" , siteURL . String ( ) )
}
// 失败 返回默认值
{
err := cache . Deletes ( [ ] string { "siteURL" } , "setting_" )
asserts . NoError ( err )
mock . ExpectQuery ( "SELECT(.+)" ) . WithArgs ( "siteURL" ) . WillReturnRows ( sqlmock . NewRows ( [ ] string { "id" , "value" } ) . AddRow ( 1 , ":][\\/\\]sdf" ) )
siteURL := GetSiteURL ( )
asserts . NoError ( mock . ExpectationsWereMet ( ) )
asserts . Equal ( "https://cloudreve.org" , siteURL . String ( ) )
}
}
func TestGetIntSetting ( t * testing . T ) {
asserts := assert . New ( t )
// 正常
{
cache . Set ( "setting_TestGetIntSetting" , "10" , 0 )
res := GetIntSetting ( "TestGetIntSetting" , 20 )
asserts . Equal ( 10 , res )
}
// 使用默认值
{
res := GetIntSetting ( "TestGetIntSetting_2" , 20 )
asserts . Equal ( 20 , res )
}
}