diff --git a/README.md b/README.md
index c5bdd048..4071885e 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,9 @@
## 前言:
- [在线文档:http://sa-token.dev33.cn/](http://sa-token.dev33.cn/)
-- 注:学习测试请拉取 master 分支,dev 为正在开发的分支,有很多特性并不稳定。(开源不易,点个 star 鼓励一下吧!)
+- 注:学习测试请拉取 master 分支,dev 为正在开发的分支,有很多特性并不稳定。
+
+- 开源不易,点个 star 鼓励一下吧!
## Sa-Token 介绍
diff --git a/pom.xml b/pom.xml
index 33ec99b1..69f45d7f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,6 +21,7 @@
sa-token-core
sa-token-starter
sa-token-plugin
+
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefaultImpl.java b/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefaultImpl.java
index dc612384..c81c10c0 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefaultImpl.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefaultImpl.java
@@ -99,7 +99,7 @@ public class SaTokenDaoDefaultImpl implements SaTokenDao {
if(getKeyTimeout(key) == SaTokenDao.NOT_VALUE_EXPIRE) {
return;
}
- // 无动作
+ dataMap.put(key, object);
}
@Override
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaResult.java b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaResult.java
index 388ab60e..d751215b 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaResult.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaResult.java
@@ -10,6 +10,7 @@ import java.util.Map;
* code=状态码
* msg=描述信息
* data=携带对象
+ *
* @author kong
*
*/
diff --git a/sa-token-test/.gitignore b/sa-token-test/.gitignore
new file mode 100644
index 00000000..8122f47c
--- /dev/null
+++ b/sa-token-test/.gitignore
@@ -0,0 +1,13 @@
+target/
+
+node_modules/
+bin/
+.settings/
+unpackage/
+.classpath
+.project
+
+.factorypath
+
+.idea/
+.iml
\ No newline at end of file
diff --git a/sa-token-test/pom.xml b/sa-token-test/pom.xml
new file mode 100644
index 00000000..26736057
--- /dev/null
+++ b/sa-token-test/pom.xml
@@ -0,0 +1,42 @@
+
+
+ 4.0.0
+
+
+ cn.dev33
+ sa-token-parent
+ 1.28.0
+
+ pom
+
+
+ sa-token-test
+ sa-token-test
+ sa-token-test
+
+
+
+
+ sa-token-core-test
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ 2.0.0.RELEASE
+ test
+
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ 2.0.0.RELEASE
+ true
+
+
+
+
diff --git a/sa-token-test/sa-token-core-test/.gitignore b/sa-token-test/sa-token-core-test/.gitignore
new file mode 100644
index 00000000..f56feec7
--- /dev/null
+++ b/sa-token-test/sa-token-core-test/.gitignore
@@ -0,0 +1,12 @@
+target/
+
+node_modules/
+bin/
+.settings/
+unpackage/
+.classpath
+.project
+
+.factorypath
+
+.idea/
\ No newline at end of file
diff --git a/sa-token-test/sa-token-core-test/pom.xml b/sa-token-test/sa-token-core-test/pom.xml
new file mode 100644
index 00000000..a6d1f5d0
--- /dev/null
+++ b/sa-token-test/sa-token-core-test/pom.xml
@@ -0,0 +1,28 @@
+
+
+ 4.0.0
+
+
+ cn.dev33
+ sa-token-test
+ 1.28.0
+
+ jar
+
+ sa-token-core-test
+ sa-token-core-test
+ sa-token-core-test
+
+
+
+ cn.dev33
+ sa-token-core
+ ${sa-token-version}
+
+
+
+
+
+
diff --git a/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/context/model/SaCookieTest.java b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/context/model/SaCookieTest.java
new file mode 100644
index 00000000..a67b1f19
--- /dev/null
+++ b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/context/model/SaCookieTest.java
@@ -0,0 +1,30 @@
+package cn.dev33.satoken.context.model;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * SaFoxUtil 工具类测试
+ *
+ * @author kong
+ * @date: 2022-2-8 22:14:25
+ */
+@RunWith(SpringRunner.class)
+public class SaCookieTest {
+
+ @Test
+ public void test() {
+ SaCookie cookie = new SaCookie("satoken", "xxxx-xxxx-xxxx-xxxx")
+ .setDomain("https://sa-token.dev33.cn/")
+ .setMaxAge(-1)
+ .setPath("/")
+ .setSameSite("Lax")
+ .setHttpOnly(true)
+ .setSecure(true);
+
+ Assert.assertEquals(cookie.toHeaderValue(), "satoken=xxxx-xxxx-xxxx-xxxx; Domain=https://sa-token.dev33.cn/; Path=/; Secure; HttpOnly; sameSite=Lax");
+ }
+
+}
diff --git a/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/dao/SaTokenDaoTest.java b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/dao/SaTokenDaoTest.java
new file mode 100644
index 00000000..ed9bff15
--- /dev/null
+++ b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/dao/SaTokenDaoTest.java
@@ -0,0 +1,73 @@
+package cn.dev33.satoken.dao;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import cn.dev33.satoken.session.SaSession;
+
+/**
+ * SaTokenDao 持久层 测试
+ *
+ * @author kong
+ * @date: 2022-2-9 15:39:38
+ */
+@RunWith(SpringRunner.class)
+public class SaTokenDaoTest {
+
+ SaTokenDao dao = new SaTokenDaoDefaultImpl();
+
+ @Test
+ public void get() {
+ dao.set("name", "zhangsan", 60);
+ Assert.assertEquals(dao.get("name"), "zhangsan");
+ Assert.assertTrue(dao.getTimeout("name") <= 60);
+ Assert.assertEquals(dao.getTimeout("name2"), -2);
+
+ dao.update("name", "lisi");
+ Assert.assertEquals(dao.get("name"), "lisi");
+
+ dao.updateTimeout("name", 100);
+ Assert.assertTrue(dao.getTimeout("name") <= 100);
+
+ dao.delete("name");
+ Assert.assertEquals(dao.get("name"), null);
+ }
+
+ @Test
+ public void getObject() {
+ dao.setObject("name", "zhangsan", 60);
+ Assert.assertEquals(dao.getObject("name"), "zhangsan");
+ Assert.assertTrue(dao.getObjectTimeout("name") <= 60);
+
+ dao.updateObject("name", "lisi");
+ Assert.assertEquals(dao.getObject("name"), "lisi");
+
+ dao.updateObjectTimeout("name", 100);
+ Assert.assertTrue(dao.getObjectTimeout("name") <= 100);
+
+ dao.deleteObject("name");
+ Assert.assertEquals(dao.getObject("name"), null);
+ }
+
+ @Test
+ public void getSession() {
+ SaSession session = new SaSession("session-1001");
+
+ dao.setSession(session, 60);
+ Assert.assertEquals(dao.getSession("session-1001").getId(), session.getId());
+ Assert.assertTrue(dao.getSessionTimeout("session-1001") <= 60);
+
+ SaSession session2 = new SaSession("session-1001");
+ dao.updateSession(session2);
+ Assert.assertEquals(dao.getSession("session-1001").getId(), session2.getId());
+
+ dao.updateSessionTimeout("session-1001", 100);
+ Assert.assertTrue(dao.getSessionTimeout("session-1001") <= 100);
+
+ dao.deleteSession("session-1001");
+ Assert.assertEquals(dao.getSession("session-1001"), null);
+ }
+
+}
diff --git a/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/fun/IsRunFunctionTest.java b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/fun/IsRunFunctionTest.java
new file mode 100644
index 00000000..d9b69f7f
--- /dev/null
+++ b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/fun/IsRunFunctionTest.java
@@ -0,0 +1,35 @@
+package cn.dev33.satoken.fun;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * IsRunFunction 测试
+ *
+ * @author kong
+ * @date: 2022-2-9 16:11:10
+ */
+@RunWith(SpringRunner.class)
+public class IsRunFunctionTest {
+
+ @Test
+ public void test() {
+
+ class TempClass{
+ int count = 1;
+ }
+ TempClass obj = new TempClass();
+
+ IsRunFunction fun = new IsRunFunction(true);
+ fun.exe(()->{
+ obj.count = 2;
+ }).noExe(()->{
+ obj.count = 3;
+ });
+
+ Assert.assertEquals(obj.count, 2);
+ }
+
+}
diff --git a/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/secure/BCryptTest.java b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/secure/BCryptTest.java
new file mode 100644
index 00000000..6a4744b4
--- /dev/null
+++ b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/secure/BCryptTest.java
@@ -0,0 +1,25 @@
+package cn.dev33.satoken.secure;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * BCrypt 加密测试
+ *
+ * @author dream.
+ * @date 2022/1/20
+ */
+@RunWith(SpringRunner.class)
+public class BCryptTest {
+
+ @Test
+ public void checkpwTest() {
+ final String hashed = BCrypt.hashpw("12345");
+// System.out.println(hashed);
+ Assert.assertTrue(BCrypt.checkpw("12345", hashed));
+ Assert.assertFalse(BCrypt.checkpw("123456", hashed));
+ }
+
+}
\ No newline at end of file
diff --git a/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/secure/SaBase64UtilTest.java b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/secure/SaBase64UtilTest.java
new file mode 100644
index 00000000..8306bd1c
--- /dev/null
+++ b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/secure/SaBase64UtilTest.java
@@ -0,0 +1,31 @@
+package cn.dev33.satoken.secure;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * SaBase64Util 测试
+ *
+ * @author kong
+ * @date: 2022-2-9
+ */
+@RunWith(SpringRunner.class)
+public class SaBase64UtilTest {
+
+ @Test
+ public void test() {
+ // 文本
+ String text = "Sa-Token 一个轻量级java权限认证框架";
+
+ // 使用Base64编码
+ String base64Text = SaBase64Util.encode(text);
+ Assert.assertEquals(base64Text, "U2EtVG9rZW4g5LiA5Liq6L276YeP57qnamF2Yeadg+mZkOiupOivgeahhuaetg==");
+
+ // 使用Base64解码
+ String text2 = SaBase64Util.decode(base64Text);
+ Assert.assertEquals(text2, "Sa-Token 一个轻量级java权限认证框架");
+ }
+
+}
diff --git a/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/secure/SaSecureUtilTest.java b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/secure/SaSecureUtilTest.java
new file mode 100644
index 00000000..1bca1c57
--- /dev/null
+++ b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/secure/SaSecureUtilTest.java
@@ -0,0 +1,67 @@
+package cn.dev33.satoken.secure;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * SaSecureUtil 加密工具类 测试
+ *
+ * @author kong
+ * @date: 2022-2-9
+ */
+@RunWith(SpringRunner.class)
+public class SaSecureUtilTest {
+
+ @Test
+ public void test() {
+
+ // md5加密
+ Assert.assertEquals(SaSecureUtil.md5("123456"), "e10adc3949ba59abbe56e057f20f883e");
+
+ // sha1加密
+ Assert.assertEquals(SaSecureUtil.sha1("123456"), "7c4a8d09ca3762af61e59520943dc26494f8941b");
+
+ // sha256加密
+ Assert.assertEquals(SaSecureUtil.sha256("123456"), "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92");
+
+ // md5加盐加密: md5(md5(str) + md5(salt))
+ Assert.assertEquals(SaSecureUtil.md5BySalt("123456", "salt"), "f52020dca765fd3943ed40a615dc2c5c");
+
+ }
+
+ @Test
+ public void aesEncrypt() {
+ // 定义秘钥和明文
+ String key = "123456";
+ String text = "Sa-Token 一个轻量级java权限认证框架";
+
+ // 加密
+ String ciphertext = SaSecureUtil.aesEncrypt(key, text);
+ Assert.assertEquals(ciphertext, "KmSqfwxY5BRuWoHMWJqtebcOZ2lEEZaj2OSi1Ei8pRx4zdi24wsnwsTQVjbXRQ0M");
+
+ // 解密
+ String text2 = SaSecureUtil.aesDecrypt(key, ciphertext);
+ Assert.assertEquals(text2, "Sa-Token 一个轻量级java权限认证框架");
+ }
+
+ @Test
+ public void rsaEncryptByPublic() {
+ // 定义私钥和公钥
+ String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAO+wmt01pwm9lHMdq7A8gkEigk0XKMfjv+4IjAFhWCSiTeP7dtlnceFJbkWxvbc7Qo3fCOpwmfcskwUc3VSgyiJkNJDs9ivPbvlt8IU2bZ+PBDxYxSCJFrgouVOpAr8ar/b6gNuYTi1vt3FkGtSjACFb002/68RKUTye8/tdcVilAgMBAAECgYA1COmrSqTUJeuD8Su9ChZ0HROhxR8T45PjMmbwIz7ilDsR1+E7R4VOKPZKW4Kz2VvnklMhtJqMs4MwXWunvxAaUFzQTTg2Fu/WU8Y9ha14OaWZABfChMZlpkmpJW9arKmI22ZuxCEsFGxghTiJQ3tK8npj5IZq5vk+6mFHQ6aJAQJBAPghz91Dpuj+0bOUfOUmzi22obWCBncAD/0CqCLnJlpfOoa9bOcXSusGuSPuKy5KiGyblHMgKI6bq7gcM2DWrGUCQQD3SkOcmia2s/6i7DUEzMKaB0bkkX4Ela/xrfV+A3GzTPv9bIBamu0VIHznuiZbeNeyw7sVo4/GTItq/zn2QJdBAkEA8xHsVoyXTVeShaDIWJKTFyT5dJ1TR++/udKIcuiNIap34tZdgGPI+EM1yoTduBM7YWlnGwA9urW0mj7F9e9WIQJAFjxqSfmeg40512KP/ed/lCQVXtYqU7U2BfBTg8pBfhLtEcOg4wTNTroGITwe2NjL5HovJ2n2sqkNXEio6Ji0QQJAFLW1Kt80qypMqot+mHhS+0KfdOpaKeMWMSR4Ij5VfE63WzETEeWAMQESxzhavN1WOTb3/p6icgcVbgPQBaWhGg==";
+ String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDvsJrdNacJvZRzHauwPIJBIoJNFyjH47/uCIwBYVgkok3j+3bZZ3HhSW5Fsb23O0KN3wjqcJn3LJMFHN1UoMoiZDSQ7PYrz275bfCFNm2fjwQ8WMUgiRa4KLlTqQK/Gq/2+oDbmE4tb7dxZBrUowAhW9NNv+vESlE8nvP7XXFYpQIDAQAB";
+
+ // 文本
+ String text = "Sa-Token 一个轻量级java权限认证框架";
+
+ // 使用公钥加密
+ String ciphertext = SaSecureUtil.rsaEncryptByPublic(publicKey, text);
+// Assert.assertEquals(ciphertext, "d9e01fd105b059e975c524a1f4dccbe10dfc3a23b931a9e168ecb0a5758a29c45532254679f86cf83a63e5cc21ef631802fe70ea47e7519f5d96e0d1fab38a6f6dbebdb34b106ce7f27c341838e4e88a8ff3298c519c29a3f0944cf8f668bfecd9394f16945d85d84c4d813d12ecadf34bfb21850c383977b5b2de848fa40995");
+
+ // 使用私钥解密
+ String text2 = SaSecureUtil.rsaDecryptByPrivate(privateKey, ciphertext);
+ Assert.assertEquals(text2, "Sa-Token 一个轻量级java权限认证框架");
+ }
+
+}
diff --git a/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/session/SaSessionTest.java b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/session/SaSessionTest.java
new file mode 100644
index 00000000..928971c5
--- /dev/null
+++ b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/session/SaSessionTest.java
@@ -0,0 +1,59 @@
+package cn.dev33.satoken.session;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * SaSession 测试
+ *
+ * @author kong
+ * @date: 2022-2-9
+ */
+@RunWith(SpringRunner.class)
+public class SaSessionTest {
+
+ @Test
+ public void test() {
+ SaSession session = new SaSession("session-1001");
+ Assert.assertEquals(session.getId(), "session-1001");
+
+ // 基础取值
+ session.set("name", "zhangsan");
+ session.set("age", 18);
+ Assert.assertEquals(session.get("name"), "zhangsan");
+ Assert.assertEquals((int)session.get("age", 20), 18);
+ Assert.assertEquals((int)session.get("age2", 20), 20);
+ Assert.assertEquals(session.getModel("age", Double.class).getClass(), Double.class);
+
+ // 复杂取值
+ class User {
+ String name;
+ int age;
+ User(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+ }
+ User user = new User("zhangsan", 18);
+ session.set("user", user);
+
+ User user2 = session.getModel("user", User.class);
+ Assert.assertNotNull(user2);
+ Assert.assertEquals(user2.name, "zhangsan");
+ Assert.assertEquals(user2.age, 18);
+
+ // Token签名
+ session.addTokenSign("xxxx-xxxx-xxxx-xxxx-1", "PC");
+ session.addTokenSign("xxxx-xxxx-xxxx-xxxx-2", "APP");
+
+ Assert.assertEquals(session.getTokenSignList().size(), 2);
+ Assert.assertEquals(session.getTokenSign("xxxx-xxxx-xxxx-xxxx-1").getDevice(), "PC");
+ Assert.assertEquals(session.getTokenSign("xxxx-xxxx-xxxx-xxxx-2").getDevice(), "APP");
+
+ session.removeTokenSign("xxxx-xxxx-xxxx-xxxx-1");
+ Assert.assertEquals(session.getTokenSignList().size(), 1);
+ }
+
+}
diff --git a/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/util/SaFoxUtilTest.java b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/util/SaFoxUtilTest.java
new file mode 100644
index 00000000..05659195
--- /dev/null
+++ b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/util/SaFoxUtilTest.java
@@ -0,0 +1,205 @@
+package cn.dev33.satoken.util;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+import org.junit.Assert;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * SaFoxUtil 工具类测试
+ *
+ * @author kong
+ * @date: 2022-2-8 22:14:25
+ */
+@RunWith(SpringRunner.class)
+public class SaFoxUtilTest {
+
+ @Test
+ public void getRandomString() {
+ String randomString = SaFoxUtil.getRandomString(8);
+ Assert.assertEquals(randomString.length(), 8);
+ }
+
+ @Test
+ public void isEmpty() {
+ Assert.assertFalse(SaFoxUtil.isEmpty("abc"));
+ Assert.assertTrue(SaFoxUtil.isEmpty(""));
+ Assert.assertTrue(SaFoxUtil.isEmpty(null));
+
+ Assert.assertTrue(SaFoxUtil.isNotEmpty("abc"));
+ }
+
+ @Test
+ public void getMarking28() {
+ Assert.assertNotEquals(SaFoxUtil.getMarking28(), SaFoxUtil.getMarking28());
+ }
+
+ @Test
+ public void formatDate() {
+ String formatDate = SaFoxUtil.formatDate(new Date(1644328600364L));
+ Assert.assertEquals(formatDate, "2022-02-08 21:56:40");
+ }
+
+ @Test
+ public void searchList() {
+ // 原始数据
+ List dataList = Arrays.asList("token1", "token2", "token3", "token4", "token5", "aaa1");
+
+ // 分页
+ List list1 = SaFoxUtil.searchList(dataList, 1, 2);
+ Assert.assertEquals(list1.size(), 2);
+ Assert.assertEquals(list1.get(0), "token2");
+ Assert.assertEquals(list1.get(1), "token3");
+
+ // 前缀筛选
+ List list2 = SaFoxUtil.searchList(dataList, "token", "", 0, 10);
+ Assert.assertEquals(list2.size(), 5);
+
+ // 关键字筛选
+ List list3 = SaFoxUtil.searchList(dataList, "", "1", 0, 10);
+ Assert.assertEquals(list3.size(), 2);
+
+ // 综合筛选
+ List list4 = SaFoxUtil.searchList(dataList, "token", "1", 0, 10);
+ Assert.assertEquals(list4.size(), 1);
+ }
+
+ @Test
+ public void vagueMatch() {
+ Assert.assertTrue(SaFoxUtil.vagueMatch("hello*", "hello"));
+ Assert.assertTrue(SaFoxUtil.vagueMatch("hello*", "hello world"));
+ Assert.assertFalse(SaFoxUtil.vagueMatch("hello*", "he"));
+ Assert.assertTrue(SaFoxUtil.vagueMatch("hello*", "hello*"));
+ }
+
+ @Test
+ public void getValueByType() {
+ Assert.assertEquals(SaFoxUtil.getValueByType("1", Integer.class).getClass(), Integer.class);
+ Assert.assertEquals(SaFoxUtil.getValueByType("1", Long.class).getClass(), Long.class);
+ Assert.assertEquals(SaFoxUtil.getValueByType("1", Double.class).getClass(), Double.class);
+ }
+
+ @Test
+ public void joinParam() {
+ Assert.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", "id=1"), "https://sa-token.dev33.cn?id=1");
+ Assert.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?", "id=1"), "https://sa-token.dev33.cn?id=1");
+ Assert.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang", "id=1"), "https://sa-token.dev33.cn?name=zhang&id=1");
+ Assert.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang&", "id=1"), "https://sa-token.dev33.cn?name=zhang&id=1");
+
+ Assert.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang&", "id", 1), "https://sa-token.dev33.cn?name=zhang&id=1");
+ }
+
+ @Test
+ public void joinSharpParam() {
+ Assert.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", "id=1"), "https://sa-token.dev33.cn#id=1");
+ Assert.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#", "id=1"), "https://sa-token.dev33.cn#id=1");
+ Assert.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang", "id=1"), "https://sa-token.dev33.cn#name=zhang&id=1");
+ Assert.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang&", "id=1"), "https://sa-token.dev33.cn#name=zhang&id=1");
+
+ Assert.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang&", "id", 1), "https://sa-token.dev33.cn#name=zhang&id=1");
+ }
+
+ @Test
+ public void arrayJoin() {
+ Assert.assertEquals(SaFoxUtil.arrayJoin(new String[] {"a", "b", "c"}), "a,b,c");
+ Assert.assertEquals(SaFoxUtil.arrayJoin(new String[] {}), "");
+ }
+
+ @Test
+ public void isUrl() {
+ Assert.assertTrue(SaFoxUtil.isUrl("https://sa-token.dev33.cn"));
+ Assert.assertTrue(SaFoxUtil.isUrl("https://www.baidu.com/"));
+
+ Assert.assertFalse(SaFoxUtil.isUrl("htt://www.baidu.com/"));
+ Assert.assertFalse(SaFoxUtil.isUrl("https:www.baidu.com/"));
+ Assert.assertFalse(SaFoxUtil.isUrl("httpswwwbaiducom/"));
+ Assert.assertFalse(SaFoxUtil.isUrl("https://www.baidu.com/,"));
+ }
+
+ @Test
+ public void encodeUrl() {
+ Assert.assertEquals(SaFoxUtil.encodeUrl("https://sa-token.dev33.cn"), "https%3A%2F%2Fsa-token.dev33.cn");
+ Assert.assertEquals(SaFoxUtil.decoderUrl("https%3A%2F%2Fsa-token.dev33.cn"), "https://sa-token.dev33.cn");
+ }
+
+ @Test
+ public void convertStringToList() {
+ List list = SaFoxUtil.convertStringToList("a,b,c");
+ Assert.assertEquals(list.size(), 3);
+ Assert.assertEquals(list.get(0), "a");
+ Assert.assertEquals(list.get(1), "b");
+ Assert.assertEquals(list.get(2), "c");
+
+ List list2 = SaFoxUtil.convertStringToList("a,");
+ Assert.assertEquals(list2.size(), 1);
+
+ List list3 = SaFoxUtil.convertStringToList(",");
+ Assert.assertEquals(list3.size(), 0);
+
+ List list4 = SaFoxUtil.convertStringToList("");
+ Assert.assertEquals(list4.size(), 0);
+
+ List list5 = SaFoxUtil.convertStringToList(null);
+ Assert.assertEquals(list5.size(), 0);
+ }
+
+ @Test
+ public void convertListToString() {
+ List list = Arrays.asList("a", "b", "c");
+ Assert.assertEquals(SaFoxUtil.convertListToString(list), "a,b,c");
+
+ List list2 = Arrays.asList();
+ Assert.assertEquals(SaFoxUtil.convertListToString(list2), "");
+ }
+
+ @Test
+ public void convertStringToArray() {
+ String[] array = SaFoxUtil.convertStringToArray("a,b,c");
+ Assert.assertEquals(array.length, 3);
+ Assert.assertEquals(array[0], "a");
+ Assert.assertEquals(array[1], "b");
+ Assert.assertEquals(array[2], "c");
+
+ String[] array2 = SaFoxUtil.convertStringToArray("a,");
+ Assert.assertEquals(array2.length, 1);
+
+ String[] array3 = SaFoxUtil.convertStringToArray(",");
+ Assert.assertEquals(array3.length, 0);
+
+ String[] array4 = SaFoxUtil.convertStringToArray("");
+ Assert.assertEquals(array4.length, 0);
+
+ String[] array5 = SaFoxUtil.convertStringToArray(null);
+ Assert.assertEquals(array5.length, 0);
+ }
+
+ @Test
+ public void convertArrayToString() {
+ String[] array = new String[] {"a", "b", "c"};
+ Assert.assertEquals(SaFoxUtil.convertArrayToString(array), "a,b,c");
+
+ String[] array2 = new String[] {};
+ Assert.assertEquals(SaFoxUtil.convertArrayToString(array2), "");
+ }
+
+ @Test
+ public void emptyList() {
+ List list = SaFoxUtil.emptyList();
+ Assert.assertEquals(list.size(), 0);
+ }
+
+ @Test
+ public void toList() {
+ List list = SaFoxUtil.toList("a","b", "c");
+ Assert.assertEquals(list.size(), 3);
+ Assert.assertEquals(list.get(0), "a");
+ Assert.assertEquals(list.get(1), "b");
+ Assert.assertEquals(list.get(2), "c");
+ }
+
+}
diff --git a/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/util/SaResultTest.java b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/util/SaResultTest.java
new file mode 100644
index 00000000..2303f214
--- /dev/null
+++ b/sa-token-test/sa-token-core-test/src/test/java/cn/dev33/satoken/util/SaResultTest.java
@@ -0,0 +1,36 @@
+package cn.dev33.satoken.util;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * SaResult 结果集 测试
+ *
+ * @author kong
+ * @date: 2022-2-8 22:14:25
+ */
+@RunWith(SpringRunner.class)
+public class SaResultTest {
+
+ @Test
+ public void test() {
+ SaResult res = new SaResult(200, "ok", "zhangsan");
+ Assert.assertEquals((int)res.getCode(), 200);
+ Assert.assertEquals(res.getMsg(), "ok");
+ Assert.assertEquals(res.getData(), "zhangsan");
+
+ res.set("age", 18);
+ Assert.assertEquals(res.get("age"), 18);
+ Assert.assertEquals(res.getOrDefault("age", 20), 18);
+ Assert.assertEquals(res.getOrDefault("age2", 20), 20);
+ }
+
+ @Test
+ public void test2() {
+ Assert.assertEquals((int)SaResult.ok().getCode(), 200);
+ Assert.assertEquals((int)SaResult.error().getCode(), 500);
+ }
+
+}