feat: tenant-scoped routing and portal navigation
This commit is contained in:
@@ -40,6 +40,7 @@ func Test_Creator(t *testing.T) {
|
||||
func (s *CreatorTestSuite) Test_Apply() {
|
||||
Convey("Apply", s.T(), func() {
|
||||
ctx := s.T().Context()
|
||||
tenantID := int64(0)
|
||||
database.Truncate(ctx, s.DB, models.TableNameTenant, models.TableNameTenantUser, models.TableNameUser)
|
||||
|
||||
u := &models.User{Username: "creator1", Phone: "13700000001"}
|
||||
@@ -50,7 +51,7 @@ func (s *CreatorTestSuite) Test_Apply() {
|
||||
form := &creator_dto.ApplyForm{
|
||||
Name: "My Channel",
|
||||
}
|
||||
err := Creator.Apply(ctx, u.ID, form)
|
||||
err := Creator.Apply(ctx, tenantID, u.ID, form)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
t, _ := models.TenantQuery.WithContext(ctx).Where(models.TenantQuery.UserID.Eq(u.ID)).First()
|
||||
@@ -72,6 +73,7 @@ func (s *CreatorTestSuite) Test_Apply() {
|
||||
func (s *CreatorTestSuite) Test_CreateContent() {
|
||||
Convey("CreateContent", s.T(), func() {
|
||||
ctx := s.T().Context()
|
||||
tenantID := int64(0)
|
||||
database.Truncate(
|
||||
ctx,
|
||||
s.DB,
|
||||
@@ -89,6 +91,7 @@ func (s *CreatorTestSuite) Test_CreateContent() {
|
||||
// Create Tenant manually
|
||||
t := &models.Tenant{UserID: u.ID, Name: "Channel 2", Code: "123", Status: consts.TenantStatusVerified}
|
||||
models.TenantQuery.WithContext(ctx).Create(t)
|
||||
tenantID = t.ID
|
||||
|
||||
Convey("should create content and assets", func() {
|
||||
form := &creator_dto.ContentCreateForm{
|
||||
@@ -97,7 +100,7 @@ func (s *CreatorTestSuite) Test_CreateContent() {
|
||||
Price: 9.99,
|
||||
// MediaIDs: ... need media asset
|
||||
}
|
||||
err := Creator.CreateContent(ctx, u.ID, form)
|
||||
err := Creator.CreateContent(ctx, tenantID, u.ID, form)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
c, _ := models.ContentQuery.WithContext(ctx).Where(models.ContentQuery.Title.Eq("New Song")).First()
|
||||
@@ -116,6 +119,7 @@ func (s *CreatorTestSuite) Test_CreateContent() {
|
||||
func (s *CreatorTestSuite) Test_UpdateContent() {
|
||||
Convey("UpdateContent", s.T(), func() {
|
||||
ctx := s.T().Context()
|
||||
tenantID := int64(0)
|
||||
database.Truncate(
|
||||
ctx,
|
||||
s.DB,
|
||||
@@ -132,6 +136,7 @@ func (s *CreatorTestSuite) Test_UpdateContent() {
|
||||
|
||||
t := &models.Tenant{UserID: u.ID, Name: "Channel 3", Code: "124", Status: consts.TenantStatusVerified}
|
||||
models.TenantQuery.WithContext(ctx).Create(t)
|
||||
tenantID = t.ID
|
||||
|
||||
c := &models.Content{TenantID: t.ID, UserID: u.ID, Title: "Old Title", Genre: "audio"}
|
||||
models.ContentQuery.WithContext(ctx).Create(c)
|
||||
@@ -145,7 +150,7 @@ func (s *CreatorTestSuite) Test_UpdateContent() {
|
||||
Genre: "video",
|
||||
Price: &price,
|
||||
}
|
||||
err := Creator.UpdateContent(ctx, u.ID, c.ID, form)
|
||||
err := Creator.UpdateContent(ctx, tenantID, u.ID, c.ID, form)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// Verify
|
||||
@@ -162,6 +167,7 @@ func (s *CreatorTestSuite) Test_UpdateContent() {
|
||||
func (s *CreatorTestSuite) Test_Dashboard() {
|
||||
Convey("Dashboard", s.T(), func() {
|
||||
ctx := s.T().Context()
|
||||
tenantID := int64(0)
|
||||
database.Truncate(
|
||||
ctx,
|
||||
s.DB,
|
||||
@@ -178,6 +184,7 @@ func (s *CreatorTestSuite) Test_Dashboard() {
|
||||
|
||||
t := &models.Tenant{UserID: u.ID, Name: "Channel 4", Code: "125", Status: consts.TenantStatusVerified}
|
||||
models.TenantQuery.WithContext(ctx).Create(t)
|
||||
tenantID = t.ID
|
||||
|
||||
// Mock Data
|
||||
// 1. Followers
|
||||
@@ -198,7 +205,7 @@ func (s *CreatorTestSuite) Test_Dashboard() {
|
||||
)
|
||||
|
||||
Convey("should get stats", func() {
|
||||
stats, err := Creator.Dashboard(ctx, u.ID)
|
||||
stats, err := Creator.Dashboard(ctx, tenantID, u.ID)
|
||||
So(err, ShouldBeNil)
|
||||
So(stats.TotalFollowers.Value, ShouldEqual, 2)
|
||||
// Implementation sums 'debit_purchase' only based on my code
|
||||
@@ -210,6 +217,7 @@ func (s *CreatorTestSuite) Test_Dashboard() {
|
||||
func (s *CreatorTestSuite) Test_PayoutAccount() {
|
||||
Convey("PayoutAccount", s.T(), func() {
|
||||
ctx := s.T().Context()
|
||||
tenantID := int64(0)
|
||||
database.Truncate(ctx, s.DB, models.TableNameTenant, models.TableNamePayoutAccount, models.TableNameUser)
|
||||
|
||||
u := &models.User{Username: "creator5", Phone: "13700000005"}
|
||||
@@ -218,6 +226,7 @@ func (s *CreatorTestSuite) Test_PayoutAccount() {
|
||||
|
||||
t := &models.Tenant{UserID: u.ID, Name: "Channel 5", Code: "126", Status: consts.TenantStatusVerified}
|
||||
models.TenantQuery.WithContext(ctx).Create(t)
|
||||
tenantID = t.ID
|
||||
|
||||
Convey("should CRUD payout account", func() {
|
||||
// Add
|
||||
@@ -227,21 +236,21 @@ func (s *CreatorTestSuite) Test_PayoutAccount() {
|
||||
Account: "user@example.com",
|
||||
Realname: "John Doe",
|
||||
}
|
||||
err := Creator.AddPayoutAccount(ctx, u.ID, form)
|
||||
err := Creator.AddPayoutAccount(ctx, tenantID, u.ID, form)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// List
|
||||
list, err := Creator.ListPayoutAccounts(ctx, u.ID)
|
||||
list, err := Creator.ListPayoutAccounts(ctx, tenantID, u.ID)
|
||||
So(err, ShouldBeNil)
|
||||
So(len(list), ShouldEqual, 1)
|
||||
So(list[0].Account, ShouldEqual, "user@example.com")
|
||||
|
||||
// Remove
|
||||
err = Creator.RemovePayoutAccount(ctx, u.ID, list[0].ID)
|
||||
err = Creator.RemovePayoutAccount(ctx, tenantID, u.ID, list[0].ID)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// Verify Empty
|
||||
list, err = Creator.ListPayoutAccounts(ctx, u.ID)
|
||||
list, err = Creator.ListPayoutAccounts(ctx, tenantID, u.ID)
|
||||
So(err, ShouldBeNil)
|
||||
So(len(list), ShouldEqual, 0)
|
||||
})
|
||||
@@ -251,6 +260,7 @@ func (s *CreatorTestSuite) Test_PayoutAccount() {
|
||||
func (s *CreatorTestSuite) Test_Withdraw() {
|
||||
Convey("Withdraw", s.T(), func() {
|
||||
ctx := s.T().Context()
|
||||
tenantID := int64(0)
|
||||
database.Truncate(
|
||||
ctx,
|
||||
s.DB,
|
||||
@@ -267,6 +277,7 @@ func (s *CreatorTestSuite) Test_Withdraw() {
|
||||
|
||||
t := &models.Tenant{UserID: u.ID, Name: "Channel 6", Code: "127", Status: consts.TenantStatusVerified}
|
||||
models.TenantQuery.WithContext(ctx).Create(t)
|
||||
tenantID = t.ID
|
||||
|
||||
pa := &models.PayoutAccount{
|
||||
TenantID: t.ID,
|
||||
@@ -283,7 +294,7 @@ func (s *CreatorTestSuite) Test_Withdraw() {
|
||||
Amount: 20.00,
|
||||
AccountID: pa.ID,
|
||||
}
|
||||
err := Creator.Withdraw(ctx, u.ID, form)
|
||||
err := Creator.Withdraw(ctx, tenantID, u.ID, form)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// Verify Balance Deducted
|
||||
@@ -308,7 +319,7 @@ func (s *CreatorTestSuite) Test_Withdraw() {
|
||||
Amount: 100.00,
|
||||
AccountID: pa.ID,
|
||||
}
|
||||
err := Creator.Withdraw(ctx, u.ID, form)
|
||||
err := Creator.Withdraw(ctx, tenantID, u.ID, form)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
@@ -317,6 +328,7 @@ func (s *CreatorTestSuite) Test_Withdraw() {
|
||||
func (s *CreatorTestSuite) Test_Refund() {
|
||||
Convey("Refund", s.T(), func() {
|
||||
ctx := s.T().Context()
|
||||
tenantID := int64(0)
|
||||
database.Truncate(ctx, s.DB,
|
||||
models.TableNameTenant, models.TableNameUser, models.TableNameOrder,
|
||||
models.TableNameOrderItem, models.TableNameContentAccess, models.TableNameTenantLedger,
|
||||
@@ -330,6 +342,7 @@ func (s *CreatorTestSuite) Test_Refund() {
|
||||
// Tenant
|
||||
t := &models.Tenant{UserID: creator.ID, Name: "Channel 7", Code: "128", Status: consts.TenantStatusVerified}
|
||||
models.TenantQuery.WithContext(ctx).Create(t)
|
||||
tenantID = t.ID
|
||||
|
||||
// Buyer
|
||||
buyer := &models.User{Username: "buyer7", Phone: "13900000007", Balance: 0}
|
||||
@@ -349,7 +362,7 @@ func (s *CreatorTestSuite) Test_Refund() {
|
||||
|
||||
Convey("should accept refund", func() {
|
||||
form := &creator_dto.RefundForm{Action: "accept", Reason: "Defective"}
|
||||
err := Creator.ProcessRefund(ctx, creator.ID, o.ID, form)
|
||||
err := Creator.ProcessRefund(ctx, tenantID, creator.ID, o.ID, form)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// Verify Order
|
||||
|
||||
Reference in New Issue
Block a user