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  }