Răsfoiți Sursa

feedbag_list: delete group items with group

Mike 3 luni în urmă
părinte
comite
4389689213
3 a modificat fișierele cu 79 adăugiri și 17 ștergeri
  1. 26 3
      server/toc/cmd_client_test.go
  2. 20 7
      state/feedbag_list.go
  3. 33 7
      state/feedbag_list_test.go

+ 26 - 3
server/toc/cmd_client_test.go

@@ -3856,8 +3856,23 @@ func TestOSCARProxy_RecvClientCmd_DelGroup(t *testing.T) {
 									Name: "", GroupID: 0, ItemID: 0, ClassID: wire.FeedbagClassIdGroup,
 									TLVLBlock: wire.TLVLBlock{TLVList: wire.TLVList{wire.NewTLVBE(wire.FeedbagAttributesOrder, []uint16{17724, 29709})}},
 								},
-								{Name: "Buddies", GroupID: 17724, ItemID: 0, ClassID: wire.FeedbagClassIdGroup},
-								{Name: "Family", GroupID: 29709, ItemID: 0, ClassID: wire.FeedbagClassIdGroup},
+								{Name: "Buddies", GroupID: 17724, ItemID: 0, ClassID: wire.FeedbagClassIdGroup,
+									TLVLBlock: wire.TLVLBlock{
+										TLVList: wire.TLVList{
+											wire.NewTLVBE(wire.FeedbagAttributesOrder, []uint16{1}),
+										},
+									},
+								},
+								{Name: "Jane", GroupID: 17724, ItemID: 1, ClassID: wire.FeedbagClassIdBuddy},
+								{Name: "Family", GroupID: 29709, ItemID: 0, ClassID: wire.FeedbagClassIdGroup,
+									TLVLBlock: wire.TLVLBlock{
+										TLVList: wire.TLVList{
+											wire.NewTLVBE(wire.FeedbagAttributesOrder, []uint16{2, 3}),
+										},
+									},
+								},
+								{Name: "Joe", GroupID: 29709, ItemID: 2, ClassID: wire.FeedbagClassIdBuddy},
+								{Name: "Fred", GroupID: 29709, ItemID: 3, ClassID: wire.FeedbagClassIdBuddy},
 							},
 							err: nil,
 						},
@@ -3867,7 +3882,15 @@ func TestOSCARProxy_RecvClientCmd_DelGroup(t *testing.T) {
 							frame: wire.SNACFrame{FoodGroup: wire.Feedbag, SubGroup: wire.FeedbagDeleteItem},
 							inBody: wire.SNAC_0x13_0x0A_FeedbagDeleteItem{
 								Items: []wire.FeedbagItem{
-									{Name: "Family", GroupID: 29709, ItemID: 0, ClassID: wire.FeedbagClassIdGroup},
+									{Name: "Family", GroupID: 29709, ItemID: 0, ClassID: wire.FeedbagClassIdGroup,
+										TLVLBlock: wire.TLVLBlock{
+											TLVList: wire.TLVList{
+												wire.NewTLVBE(wire.FeedbagAttributesOrder, []uint16{2, 3}),
+											},
+										},
+									},
+									{Name: "Joe", GroupID: 29709, ItemID: 2, ClassID: wire.FeedbagClassIdBuddy},
+									{Name: "Fred", GroupID: 29709, ItemID: 3, ClassID: wire.FeedbagClassIdBuddy},
 								},
 							},
 							msg: nil, err: nil,

+ 20 - 7
state/feedbag_list.go

@@ -83,14 +83,27 @@ func (f *FeedbagList) AddGroup(name string) wire.FeedbagItem {
 // DeleteGroup marks a group item for deletion by name. If the group exists
 // and is not the root group, the root group's order TLV is updated.
 func (f *FeedbagList) DeleteGroup(groupName string) {
-	deleted, found := f.deleteItem(wire.FeedbagItem{
-		Name:    groupName,
-		ClassID: wire.FeedbagClassIdGroup,
-	})
-	if found && deleted.GroupID > 0 {
+	groupItem := f.groupByName(groupName)
+	if groupItem == nil {
+		return
+	}
+
+	var toDelete []*wire.FeedbagItem
+
+	for _, item := range f.items {
+		if item.GroupID == groupItem.GroupID {
+			toDelete = append(toDelete, item)
+		}
+	}
+
+	for _, item := range toDelete {
+		f.deleteItem(*item)
+	}
+
+	if len(toDelete) > 0 && groupItem.GroupID != 0 {
 		for _, item := range f.items {
 			if item.ClassID == wire.FeedbagClassIdGroup && item.GroupID == 0 {
-				item.RemoveOrderMembers(deleted.GroupID)
+				item.RemoveOrderMembers(groupItem.GroupID)
 				f.trackUpdate(item)
 			}
 		}
@@ -229,7 +242,7 @@ func (f *FeedbagList) itemsMatch(a, b *wire.FeedbagItem) bool {
 	}
 	var nameMatch bool
 	if hasScreenName(a.ClassID) {
-		nameMatch = a.Name == NewIdentScreenName(b.Name).String()
+		nameMatch = NewIdentScreenName(a.Name).String() == NewIdentScreenName(b.Name).String()
 	} else {
 		nameMatch = a.Name == b.Name
 	}

+ 33 - 7
state/feedbag_list_test.go

@@ -475,26 +475,52 @@ func TestFeedbagList_DeleteGroup(t *testing.T) {
 	t.Run("updates root group order", func(t *testing.T) {
 		fl := NewFeedbagList([]wire.FeedbagItem{
 			{
-				Name:    "",
-				ClassID: wire.FeedbagClassIdGroup,
-				GroupID: 0,
+				Name: "", ClassID: wire.FeedbagClassIdGroup, GroupID: 0,
 				TLVLBlock: wire.TLVLBlock{
 					TLVList: wire.TLVList{
 						wire.NewTLVBE(wire.FeedbagAttributesOrder, []uint16{1, 2, 3}),
 					},
 				},
 			},
-			{Name: "Buddies", ClassID: wire.FeedbagClassIdGroup, GroupID: 1},
-			{Name: "Coworkers", ClassID: wire.FeedbagClassIdGroup, GroupID: 2},
-			{Name: "Family", ClassID: wire.FeedbagClassIdGroup, GroupID: 3},
+			{
+				Name: "Buddies", ClassID: wire.FeedbagClassIdGroup, GroupID: 1,
+				TLVLBlock: wire.TLVLBlock{
+					TLVList: wire.TLVList{
+						wire.NewTLVBE(wire.FeedbagAttributesOrder, []uint16{1}),
+					},
+				},
+			},
+			{Name: "Jane", ClassID: wire.FeedbagClassIdBuddy, GroupID: 1, ItemID: 1},
+			{
+				Name: "Coworkers", ClassID: wire.FeedbagClassIdGroup, GroupID: 2,
+				TLVLBlock: wire.TLVLBlock{
+					TLVList: wire.TLVList{
+						wire.NewTLVBE(wire.FeedbagAttributesOrder, []uint16{2, 3}),
+					},
+				},
+			},
+			{Name: "Joe", ClassID: wire.FeedbagClassIdBuddy, GroupID: 2, ItemID: 2},
+			{Name: "Fred", ClassID: wire.FeedbagClassIdBuddy, GroupID: 2, ItemID: 3},
+			{Name: "Family", ClassID: wire.FeedbagClassIdGroup, GroupID: 3,
+				TLVLBlock: wire.TLVLBlock{
+					TLVList: wire.TLVList{
+						wire.NewTLVBE(wire.FeedbagAttributesOrder, []uint16{4}),
+					},
+				},
+			},
+			{Name: "Alice", ClassID: wire.FeedbagClassIdBuddy, GroupID: 3, ItemID: 4},
 		}, nil)
 
 		fl.DeleteGroup("Coworkers")
 
 		deletes := fl.PendingDeletes()
-		assert.Len(t, deletes, 1)
+		assert.Len(t, deletes, 3)
 		assert.Equal(t, "Coworkers", deletes[0].Name)
 		assert.Equal(t, uint16(2), deletes[0].GroupID)
+		assert.Equal(t, "Joe", deletes[1].Name)
+		assert.Equal(t, uint16(2), deletes[1].GroupID)
+		assert.Equal(t, "Fred", deletes[2].Name)
+		assert.Equal(t, uint16(2), deletes[2].GroupID)
 
 		upserts := fl.PendingUpdates()
 		assert.Len(t, upserts, 1)