[#33] Add IterateContainers method #34
3 changed files with 35 additions and 1 deletions
|
@ -1,5 +1,5 @@
|
|||
name: "Container"
|
||||
safemethods: ["count", "containersOf", "get", "owner", "list", "eACL", "getContainerSize", "listContainerSizes", "iterateContainerSizes", "version"]
|
||||
safemethods: ["count", "containersOf", "get", "owner", "list", "iterateContainers", "eACL", "getContainerSize", "listContainerSizes", "iterateContainerSizes", "version"]
|
||||
permissions:
|
||||
- methods: ["update", "addKey", "transferX",
|
||||
"register", "addRecord", "deleteRecords"]
|
||||
|
|
|
@ -404,6 +404,16 @@ func List(owner []byte) [][]byte {
|
|||
return list
|
||||
}
|
||||
|
||||
// IterateContainers iterates over all containers. Iterator values are structures that contain a
|
||||
// stable marshaled Container structure, the signature, the public key of the container creator and
|
||||
// a stable marshaled SessionToken structure if it was provided.
|
||||
func IterateContainers() iterator.Iterator {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
key := []byte{containerKeyPrefix}
|
||||
return storage.Find(ctx, key, storage.ValuesOnly|storage.DeserializeValues)
|
||||
}
|
||||
|
||||
// SetEACL method sets a new extended ACL table related to the contract
|
||||
// if it was invoked by Alphabet nodes of the Inner Ring.
|
||||
//
|
||||
|
|
|
@ -142,6 +142,7 @@ func checkContainerList(t *testing.T, c *neotest.ContractInvoker, expected [][]b
|
|||
}
|
||||
require.ElementsMatch(t, expected, actual)
|
||||
})
|
||||
|
||||
t.Run("check with `containersOf`", func(t *testing.T) {
|
||||
s, err := c.TestInvoke(t, "containersOf", nil)
|
||||
require.NoError(t, err)
|
||||
|
@ -159,6 +160,29 @@ func checkContainerList(t *testing.T, c *neotest.ContractInvoker, expected [][]b
|
|||
require.ElementsMatch(t, expected, actual)
|
||||
})
|
||||
|
||||
t.Run("check with `iterateContainers`", func(t *testing.T) {
|
||||
s, err := c.TestInvoke(t, "iterateContainers")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, 1, s.Len())
|
||||
|
||||
iter, ok := s.Top().Value().(*storage.Iterator)
|
||||
require.True(t, ok)
|
||||
|
||||
// Iterator contains pairs: key + estimation (as stack item), we extract estimations only
|
||||
actualIds := make([][]byte, 0, len(expected))
|
||||
for iter.Next() {
|
||||
// Parse iterator value into container fields and extract container value which is 1st field
|
||||
containerFields, ok := iter.Value().Value().([]stackitem.Item)
|
||||
require.True(t, ok)
|
||||
require.Len(t, containerFields, 4)
|
||||
containerValue, err := containerFields[0].TryBytes()
|
||||
require.NoError(t, err)
|
||||
|
||||
containerId := sha256.Sum256(containerValue)
|
||||
actualIds = append(actualIds, containerId[:])
|
||||
}
|
||||
require.ElementsMatch(t, expected, actualIds)
|
||||
})
|
||||
}
|
||||
|
||||
func TestContainerPut(t *testing.T) {
|
||||
|
|
Loading…
Reference in a new issue