github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/middleware/share_test.go (about)

     1  package middleware
     2  
     3  import (
     4  	"net/http/httptest"
     5  	"testing"
     6  
     7  	"github.com/DATA-DOG/go-sqlmock"
     8  	model "github.com/cloudreve/Cloudreve/v3/models"
     9  	"github.com/cloudreve/Cloudreve/v3/pkg/conf"
    10  	"github.com/gin-gonic/gin"
    11  	"github.com/jinzhu/gorm"
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  func TestShareAvailable(t *testing.T) {
    16  	asserts := assert.New(t)
    17  	rec := httptest.NewRecorder()
    18  	testFunc := ShareAvailable()
    19  
    20  	// 分享不存在
    21  	{
    22  		c, _ := gin.CreateTestContext(rec)
    23  		c.Params = []gin.Param{
    24  			{"id", "empty"},
    25  		}
    26  		testFunc(c)
    27  		asserts.True(c.IsAborted())
    28  	}
    29  
    30  	// 通过
    31  	{
    32  		conf.SystemConfig.HashIDSalt = ""
    33  		// 用户组
    34  		mock.ExpectQuery("SELECT(.+)groups(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(3))
    35  		mock.ExpectQuery("SELECT(.+)shares(.+)").
    36  			WillReturnRows(
    37  				sqlmock.NewRows(
    38  					[]string{"id", "remain_downloads", "source_id"}).
    39  					AddRow(1, 1, 2),
    40  			)
    41  		mock.ExpectQuery("SELECT(.+)files(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(2))
    42  		c, _ := gin.CreateTestContext(rec)
    43  		c.Params = []gin.Param{
    44  			{"id", "x9T4"},
    45  		}
    46  		testFunc(c)
    47  		asserts.NoError(mock.ExpectationsWereMet())
    48  		asserts.False(c.IsAborted())
    49  		asserts.NotNil(c.Get("user"))
    50  		asserts.NotNil(c.Get("share"))
    51  	}
    52  }
    53  
    54  func TestShareCanPreview(t *testing.T) {
    55  	asserts := assert.New(t)
    56  	rec := httptest.NewRecorder()
    57  	testFunc := ShareCanPreview()
    58  
    59  	// 无分享上下文
    60  	{
    61  		c, _ := gin.CreateTestContext(rec)
    62  		testFunc(c)
    63  		asserts.True(c.IsAborted())
    64  	}
    65  
    66  	// 可以预览
    67  	{
    68  		c, _ := gin.CreateTestContext(rec)
    69  		c.Set("share", &model.Share{PreviewEnabled: true})
    70  		testFunc(c)
    71  		asserts.False(c.IsAborted())
    72  	}
    73  
    74  	// 未开启预览
    75  	{
    76  		c, _ := gin.CreateTestContext(rec)
    77  		c.Set("share", &model.Share{PreviewEnabled: false})
    78  		testFunc(c)
    79  		asserts.True(c.IsAborted())
    80  	}
    81  }
    82  
    83  func TestCheckShareUnlocked(t *testing.T) {
    84  	asserts := assert.New(t)
    85  	rec := httptest.NewRecorder()
    86  	testFunc := CheckShareUnlocked()
    87  
    88  	// 无分享上下文
    89  	{
    90  		c, _ := gin.CreateTestContext(rec)
    91  		testFunc(c)
    92  		asserts.True(c.IsAborted())
    93  	}
    94  
    95  	// 无密码
    96  	{
    97  		c, _ := gin.CreateTestContext(rec)
    98  		c.Set("share", &model.Share{})
    99  		testFunc(c)
   100  		asserts.False(c.IsAborted())
   101  	}
   102  
   103  }
   104  
   105  func TestBeforeShareDownload(t *testing.T) {
   106  	asserts := assert.New(t)
   107  	rec := httptest.NewRecorder()
   108  	testFunc := BeforeShareDownload()
   109  
   110  	// 无分享上下文
   111  	{
   112  		c, _ := gin.CreateTestContext(rec)
   113  		testFunc(c)
   114  		asserts.True(c.IsAborted())
   115  
   116  		c, _ = gin.CreateTestContext(rec)
   117  		c.Set("share", &model.Share{})
   118  		testFunc(c)
   119  		asserts.True(c.IsAborted())
   120  	}
   121  
   122  	// 用户不能下载
   123  	{
   124  		c, _ := gin.CreateTestContext(rec)
   125  		c.Set("share", &model.Share{})
   126  		c.Set("user", &model.User{
   127  			Group: model.Group{OptionsSerialized: model.GroupOption{}},
   128  		})
   129  		testFunc(c)
   130  		asserts.True(c.IsAborted())
   131  	}
   132  
   133  	// 可以下载
   134  	{
   135  		c, _ := gin.CreateTestContext(rec)
   136  		c.Set("share", &model.Share{})
   137  		c.Set("user", &model.User{
   138  			Model: gorm.Model{ID: 1},
   139  			Group: model.Group{OptionsSerialized: model.GroupOption{
   140  				ShareDownload: true,
   141  			}},
   142  		})
   143  		testFunc(c)
   144  		asserts.False(c.IsAborted())
   145  	}
   146  }
   147  
   148  func TestShareOwner(t *testing.T) {
   149  	asserts := assert.New(t)
   150  	rec := httptest.NewRecorder()
   151  	testFunc := ShareOwner()
   152  
   153  	// 未登录
   154  	{
   155  		c, _ := gin.CreateTestContext(rec)
   156  		testFunc(c)
   157  		asserts.True(c.IsAborted())
   158  
   159  		c, _ = gin.CreateTestContext(rec)
   160  		c.Set("share", &model.Share{})
   161  		testFunc(c)
   162  		asserts.True(c.IsAborted())
   163  	}
   164  
   165  	// 非用户所创建分享
   166  	{
   167  		c, _ := gin.CreateTestContext(rec)
   168  		testFunc(c)
   169  		asserts.True(c.IsAborted())
   170  
   171  		c, _ = gin.CreateTestContext(rec)
   172  		c.Set("share", &model.Share{User: model.User{Model: gorm.Model{ID: 1}}})
   173  		c.Set("user", &model.User{})
   174  		testFunc(c)
   175  		asserts.True(c.IsAborted())
   176  	}
   177  
   178  	// 正常
   179  	{
   180  		c, _ := gin.CreateTestContext(rec)
   181  		testFunc(c)
   182  		asserts.True(c.IsAborted())
   183  
   184  		c, _ = gin.CreateTestContext(rec)
   185  		c.Set("share", &model.Share{})
   186  		c.Set("user", &model.User{})
   187  		testFunc(c)
   188  		asserts.False(c.IsAborted())
   189  	}
   190  }