@@ -1437,3 +1437,277 @@ func (suite *RepositoryTestSuite) TestUpdateBackgroundJob() {
14371437 require .Equal (suite .T (), pkg .BackgroundJobStatusFailed , foundAllBackgroundJobs [0 ].JobStatus )
14381438 require .NotNil (suite .T (), foundAllBackgroundJobs [0 ].DoneTime )
14391439}
1440+
1441+ func (suite * RepositoryTestSuite ) TestUpdateUserAndPermissions () {
1442+ //setup
1443+ fakeConfig := mock_config .NewMockInterface (suite .MockCtrl )
1444+ fakeConfig .EXPECT ().GetString ("database.location" ).Return (suite .TestDatabase .Name ()).AnyTimes ()
1445+ fakeConfig .EXPECT ().GetString ("database.type" ).Return ("sqlite" ).AnyTimes ()
1446+ fakeConfig .EXPECT ().IsSet ("database.encryption.key" ).Return (false ).AnyTimes ()
1447+ fakeConfig .EXPECT ().GetString ("log.level" ).Return ("INFO" ).AnyTimes ()
1448+ dbRepo , err := NewRepository (fakeConfig , logrus .WithField ("test" , suite .T ().Name ()), event_bus .NewNoopEventBusServer ())
1449+ require .NoError (suite .T (), err )
1450+
1451+ // Create initial user
1452+ userModel := & models.User {
1453+ Username : "test_username" ,
1454+ Password : "testpassword" ,
1455+ Email : "test@test.com" ,
1456+ FullName : "Test User" ,
1457+ Role : pkg .UserRoleUser ,
1458+ }
1459+ err = dbRepo .CreateUser (context .Background (), userModel )
1460+ require .NoError (suite .T (), err )
1461+
1462+ // Create target user for permissions
1463+ targetUser := & models.User {
1464+ Username : "target_user" ,
1465+ Password : "targetpass" ,
1466+ Email : "target@test.com" ,
1467+ FullName : "Target User" ,
1468+ Role : pkg .UserRoleUser ,
1469+ }
1470+ err = dbRepo .CreateUser (context .Background (), targetUser )
1471+ require .NoError (suite .T (), err )
1472+
1473+ // Update user with new details and permissions
1474+ updatedUser := models.User {
1475+ ModelBase : models.ModelBase {ID : userModel .ID },
1476+ Username : "test_username" ,
1477+ Email : "newemail@test.com" ,
1478+ FullName : "Updated Name" ,
1479+ Role : pkg .UserRoleAdmin ,
1480+ Permissions : map [string ]map [string ]bool {
1481+ targetUser .ID .String (): {
1482+ "read" : true ,
1483+ "manage_sources" : true ,
1484+ },
1485+ },
1486+ }
1487+
1488+ // Test
1489+ err = dbRepo .UpdateUserAndPermissions (context .WithValue (context .Background (), pkg .ContextKeyTypeAuthUsername , "test_username" ), updatedUser )
1490+ require .NoError (suite .T (), err )
1491+
1492+ // Verify
1493+ updatedUserResult , err := dbRepo .GetUser (context .Background (), userModel .ID )
1494+ require .NoError (suite .T (), err )
1495+ require .Equal (suite .T (), "newemail@test.com" , updatedUserResult .Email )
1496+ require .Equal (suite .T (), "Updated Name" , updatedUserResult .FullName )
1497+ require .Equal (suite .T (), pkg .UserRoleAdmin , updatedUserResult .Role )
1498+ require .Equal (suite .T (), true , updatedUserResult .Permissions [targetUser .ID .String ()]["read" ])
1499+ require .Equal (suite .T (), true , updatedUserResult .Permissions [targetUser .ID .String ()]["manage_sources" ])
1500+ }
1501+
1502+ func (suite * RepositoryTestSuite ) TestUpdateUserAndPermissions_NonExistentUser () {
1503+ //setup
1504+ fakeConfig := mock_config .NewMockInterface (suite .MockCtrl )
1505+ fakeConfig .EXPECT ().GetString ("database.location" ).Return (suite .TestDatabase .Name ()).AnyTimes ()
1506+ fakeConfig .EXPECT ().GetString ("database.type" ).Return ("sqlite" ).AnyTimes ()
1507+ fakeConfig .EXPECT ().IsSet ("database.encryption.key" ).Return (false ).AnyTimes ()
1508+ fakeConfig .EXPECT ().GetString ("log.level" ).Return ("INFO" ).AnyTimes ()
1509+ dbRepo , err := NewRepository (fakeConfig , logrus .WithField ("test" , suite .T ().Name ()), event_bus .NewNoopEventBusServer ())
1510+ require .NoError (suite .T (), err )
1511+
1512+ // Try to update non-existent user
1513+ nonExistentUser := models.User {
1514+ ModelBase : models.ModelBase {ID : uuid .New ()},
1515+ Username : "nonexistent" ,
1516+ Email : "nonexistent@test.com" ,
1517+ FullName : "Non Existent" ,
1518+ Role : pkg .UserRoleUser ,
1519+ }
1520+
1521+ // Test
1522+ err = dbRepo .UpdateUserAndPermissions (context .Background (), nonExistentUser )
1523+ require .Error (suite .T (), err )
1524+ }
1525+
1526+ func (suite * RepositoryTestSuite ) TestUpdateUserAndPermissions_RemovePermissions () {
1527+ //setup
1528+ fakeConfig := mock_config .NewMockInterface (suite .MockCtrl )
1529+ fakeConfig .EXPECT ().GetString ("database.location" ).Return (suite .TestDatabase .Name ()).AnyTimes ()
1530+ fakeConfig .EXPECT ().GetString ("database.type" ).Return ("sqlite" ).AnyTimes ()
1531+ fakeConfig .EXPECT ().IsSet ("database.encryption.key" ).Return (false ).AnyTimes ()
1532+ fakeConfig .EXPECT ().GetString ("log.level" ).Return ("INFO" ).AnyTimes ()
1533+ dbRepo , err := NewRepository (fakeConfig , logrus .WithField ("test" , suite .T ().Name ()), event_bus .NewNoopEventBusServer ())
1534+ require .NoError (suite .T (), err )
1535+
1536+ // Create initial user
1537+ userModel := & models.User {
1538+ Username : "test_username" ,
1539+ Password : "testpassword" ,
1540+ Email : "test@test.com" ,
1541+ FullName : "Test User" ,
1542+ Role : pkg .UserRoleUser ,
1543+ }
1544+ err = dbRepo .CreateUser (context .Background (), userModel )
1545+ require .NoError (suite .T (), err )
1546+
1547+ // Create target user for permissions
1548+ targetUser := & models.User {
1549+ Username : "target_user" ,
1550+ Password : "targetpass" ,
1551+ Email : "target@test.com" ,
1552+ FullName : "Target User" ,
1553+ Role : pkg .UserRoleUser ,
1554+ }
1555+ err = dbRepo .CreateUser (context .Background (), targetUser )
1556+ require .NoError (suite .T (), err )
1557+
1558+ // First update: add permissions
1559+ userWithPermissions := models.User {
1560+ ModelBase : models.ModelBase {ID : userModel .ID },
1561+ Username : "test_username" ,
1562+ Email : "test@test.com" ,
1563+ FullName : "Test User" ,
1564+ Role : pkg .UserRoleUser ,
1565+ Permissions : map [string ]map [string ]bool {
1566+ targetUser .ID .String (): {
1567+ "read" : true ,
1568+ "manage_sources" : true ,
1569+ },
1570+ },
1571+ }
1572+
1573+ err = dbRepo .UpdateUserAndPermissions (context .WithValue (context .Background (), pkg .ContextKeyTypeAuthUsername , "test_username" ), userWithPermissions )
1574+ require .NoError (suite .T (), err )
1575+
1576+ // Second update: remove all permissions
1577+ userWithoutPermissions := models.User {
1578+ ModelBase : models.ModelBase {ID : userModel .ID },
1579+ Username : "test_username" ,
1580+ Email : "test@test.com" ,
1581+ FullName : "Test User" ,
1582+ Role : pkg .UserRoleUser ,
1583+ Permissions : map [string ]map [string ]bool {},
1584+ }
1585+
1586+ // Test
1587+ err = dbRepo .UpdateUserAndPermissions (context .WithValue (context .Background (), pkg .ContextKeyTypeAuthUsername , "test_username" ), userWithoutPermissions )
1588+ require .NoError (suite .T (), err )
1589+
1590+ // Verify
1591+ updatedUserResult , err := dbRepo .GetUser (context .Background (), userModel .ID )
1592+ require .NoError (suite .T (), err )
1593+ require .Empty (suite .T (), updatedUserResult .Permissions [targetUser .ID .String ()])
1594+ }
1595+
1596+ func (suite * RepositoryTestSuite ) TestGetUser () {
1597+ //setup
1598+ fakeConfig := mock_config .NewMockInterface (suite .MockCtrl )
1599+ fakeConfig .EXPECT ().GetString ("database.location" ).Return (suite .TestDatabase .Name ()).AnyTimes ()
1600+ fakeConfig .EXPECT ().GetString ("database.type" ).Return ("sqlite" ).AnyTimes ()
1601+ fakeConfig .EXPECT ().IsSet ("database.encryption.key" ).Return (false ).AnyTimes ()
1602+ fakeConfig .EXPECT ().GetString ("log.level" ).Return ("INFO" ).AnyTimes ()
1603+ dbRepo , err := NewRepository (fakeConfig , logrus .WithField ("test" , suite .T ().Name ()), event_bus .NewNoopEventBusServer ())
1604+ require .NoError (suite .T (), err )
1605+
1606+ // Create initial user
1607+ userModel := & models.User {
1608+ Username : "test_username" ,
1609+ Password : "testpassword" ,
1610+ Email : "test@test.com" ,
1611+ FullName : "Test User" ,
1612+ Role : pkg .UserRoleUser ,
1613+ }
1614+ err = dbRepo .CreateUser (context .Background (), userModel )
1615+ require .NoError (suite .T (), err )
1616+
1617+ // Create target user for permissions
1618+ targetUser := & models.User {
1619+ Username : "target_user" ,
1620+ Password : "targetpass" ,
1621+ Email : "target@test.com" ,
1622+ FullName : "Target User" ,
1623+ Role : pkg .UserRoleUser ,
1624+ }
1625+ err = dbRepo .CreateUser (context .Background (), targetUser )
1626+ require .NoError (suite .T (), err )
1627+
1628+ // Add permissions
1629+ userWithPermissions := models.User {
1630+ ModelBase : models.ModelBase {ID : userModel .ID },
1631+ Username : "test_username" ,
1632+ Email : "test@test.com" ,
1633+ FullName : "Test User" ,
1634+ Role : pkg .UserRoleUser ,
1635+ Permissions : map [string ]map [string ]bool {
1636+ targetUser .ID .String (): {
1637+ "read" : true ,
1638+ "manage_sources" : true ,
1639+ },
1640+ },
1641+ }
1642+
1643+ err = dbRepo .UpdateUserAndPermissions (context .WithValue (context .Background (), pkg .ContextKeyTypeAuthUsername , "test_username" ), userWithPermissions )
1644+ require .NoError (suite .T (), err )
1645+
1646+ // Test
1647+ foundUser , err := dbRepo .GetUser (context .Background (), userModel .ID )
1648+
1649+ // Verify
1650+ require .NoError (suite .T (), err )
1651+ require .Equal (suite .T (), userModel .ID , foundUser .ID )
1652+ require .Equal (suite .T (), userModel .Username , foundUser .Username )
1653+ require .Equal (suite .T (), userModel .Email , foundUser .Email )
1654+ require .Equal (suite .T (), userModel .FullName , foundUser .FullName )
1655+ require .Equal (suite .T (), userModel .Role , foundUser .Role )
1656+ require .Empty (suite .T (), foundUser .Password ) // Password should be sanitized
1657+ require .Equal (suite .T (), true , foundUser .Permissions [targetUser .ID .String ()]["read" ])
1658+ require .Equal (suite .T (), true , foundUser .Permissions [targetUser .ID .String ()]["manage_sources" ])
1659+ }
1660+
1661+ func (suite * RepositoryTestSuite ) TestGetUser_NonExistentUser () {
1662+ //setup
1663+ fakeConfig := mock_config .NewMockInterface (suite .MockCtrl )
1664+ fakeConfig .EXPECT ().GetString ("database.location" ).Return (suite .TestDatabase .Name ()).AnyTimes ()
1665+ fakeConfig .EXPECT ().GetString ("database.type" ).Return ("sqlite" ).AnyTimes ()
1666+ fakeConfig .EXPECT ().IsSet ("database.encryption.key" ).Return (false ).AnyTimes ()
1667+ fakeConfig .EXPECT ().GetString ("log.level" ).Return ("INFO" ).AnyTimes ()
1668+ dbRepo , err := NewRepository (fakeConfig , logrus .WithField ("test" , suite .T ().Name ()), event_bus .NewNoopEventBusServer ())
1669+ require .NoError (suite .T (), err )
1670+
1671+ // Test
1672+ nonExistentID := uuid .New ()
1673+ foundUser , err := dbRepo .GetUser (context .Background (), nonExistentID )
1674+
1675+ // Verify
1676+ require .Error (suite .T (), err )
1677+ require .Nil (suite .T (), foundUser )
1678+ }
1679+
1680+ func (suite * RepositoryTestSuite ) TestGetUser_NoPermissions () {
1681+ //setup
1682+ fakeConfig := mock_config .NewMockInterface (suite .MockCtrl )
1683+ fakeConfig .EXPECT ().GetString ("database.location" ).Return (suite .TestDatabase .Name ()).AnyTimes ()
1684+ fakeConfig .EXPECT ().GetString ("database.type" ).Return ("sqlite" ).AnyTimes ()
1685+ fakeConfig .EXPECT ().IsSet ("database.encryption.key" ).Return (false ).AnyTimes ()
1686+ fakeConfig .EXPECT ().GetString ("log.level" ).Return ("INFO" ).AnyTimes ()
1687+ dbRepo , err := NewRepository (fakeConfig , logrus .WithField ("test" , suite .T ().Name ()), event_bus .NewNoopEventBusServer ())
1688+ require .NoError (suite .T (), err )
1689+
1690+ // Create user without any permissions
1691+ userModel := & models.User {
1692+ Username : "test_username" ,
1693+ Password : "testpassword" ,
1694+ Email : "test@test.com" ,
1695+ FullName : "Test User" ,
1696+ Role : pkg .UserRoleUser ,
1697+ }
1698+ err = dbRepo .CreateUser (context .Background (), userModel )
1699+ require .NoError (suite .T (), err )
1700+
1701+ // Test
1702+ foundUser , err := dbRepo .GetUser (context .Background (), userModel .ID )
1703+
1704+ // Verify
1705+ require .NoError (suite .T (), err )
1706+ require .Equal (suite .T (), userModel .ID , foundUser .ID )
1707+ require .Equal (suite .T (), userModel .Username , foundUser .Username )
1708+ require .Equal (suite .T (), userModel .Email , foundUser .Email )
1709+ require .Equal (suite .T (), userModel .FullName , foundUser .FullName )
1710+ require .Equal (suite .T (), userModel .Role , foundUser .Role )
1711+ require .Empty (suite .T (), foundUser .Password ) // Password should be sanitized
1712+ require .Empty (suite .T (), foundUser .Permissions ) // No permissions should be present
1713+ }
0 commit comments