-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathentry_folder_test.go
More file actions
354 lines (306 loc) · 13.2 KB
/
entry_folder_test.go
File metadata and controls
354 lines (306 loc) · 13.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
//go:build integration
package dvls
import (
"fmt"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// All folder subtypes to test
var folderSubTypes = []string{
EntryFolderSubTypeCompany,
EntryFolderSubTypeCredentials,
EntryFolderSubTypeCustomer,
EntryFolderSubTypeDatabase,
EntryFolderSubTypeDevice,
EntryFolderSubTypeDomain,
EntryFolderSubTypeFolder,
EntryFolderSubTypeIdentity,
EntryFolderSubTypeMacroScriptTools,
EntryFolderSubTypePrinter,
EntryFolderSubTypeServer,
EntryFolderSubTypeSite,
EntryFolderSubTypeSmartFolder,
EntryFolderSubTypeSoftware,
EntryFolderSubTypeTeam,
EntryFolderSubTypeWorkstation,
}
func Test_FolderCRUD(t *testing.T) {
vault := createTestVault(t, "folders")
for _, subType := range folderSubTypes {
t.Run(subType, func(t *testing.T) {
testPath := ""
entryName := fmt.Sprintf("Test %s Folder", subType)
description := fmt.Sprintf("Test %s folder entry", strings.ToLower(subType))
// Initial data with domain and username
initialDomain := fmt.Sprintf("%s.local", strings.ToLower(subType))
initialUsername := fmt.Sprintf("%s-user", strings.ToLower(subType))
// Create entry
t.Logf("Creating %s folder with domain=%q, username=%q", subType, initialDomain, initialUsername)
entry := Entry{
VaultId: vault.Id,
Name: entryName,
Path: testPath,
Type: EntryFolderType,
SubType: subType,
Description: description,
Tags: []string{"test", strings.ToLower(subType)},
Data: &EntryFolderData{
Domain: initialDomain,
Username: initialUsername,
},
}
id, err := testClient.Entries.Folder.New(entry)
require.NoError(t, err, "Failed to create %s folder", subType)
require.NotEmpty(t, id, "Entry ID should not be empty after creation")
t.Logf("Created folder with ID: %s", id)
// Get entry and verify domain/username
t.Logf("Fetching folder %s", id)
fetched, err := testClient.Entries.Folder.GetById(vault.Id, id)
require.NoError(t, err, "Failed to get %s folder", subType)
assert.Equal(t, entry.Name, fetched.Name)
assert.Equal(t, entry.Description, fetched.Description)
assert.Equal(t, EntryFolderType, fetched.Type, "Type should be Folder")
assert.Equal(t, subType, fetched.SubType, "SubType should match")
t.Logf("Verified type=%q, subType=%q", fetched.Type, fetched.SubType)
// Verify data fields after creation
data, ok := fetched.GetFolderData()
require.True(t, ok, "Expected EntryFolderData type")
assert.Equal(t, initialDomain, data.Domain, "Domain should match after creation")
assert.Equal(t, initialUsername, data.Username, "Username should match after creation")
t.Logf("Verified data: domain=%q, username=%q", data.Domain, data.Username)
// Update entry with new domain and username
updatedDomain := fmt.Sprintf("updated.%s.local", strings.ToLower(subType))
updatedUsername := fmt.Sprintf("updated-%s-user", strings.ToLower(subType))
newName := entryName + " (Updated)"
newDescription := description + " - modified"
t.Logf("Updating folder: domain=%q->%q, username=%q->%q", initialDomain, updatedDomain, initialUsername, updatedUsername)
fetched.Name = newName
fetched.Description = newDescription
fetched.Tags = []string{"test", "updated"}
fetched.Data = &EntryFolderData{
Domain: updatedDomain,
Username: updatedUsername,
}
updated, err := testClient.Entries.Folder.Update(fetched)
require.NoError(t, err, "Failed to update %s folder", subType)
assert.Equal(t, newName, updated.Name)
assert.Equal(t, newDescription, updated.Description)
// Verify data fields after update
updatedData, ok := updated.GetFolderData()
require.True(t, ok, "Expected EntryFolderData type after update")
assert.Equal(t, updatedDomain, updatedData.Domain, "Domain should match after update")
assert.Equal(t, updatedUsername, updatedData.Username, "Username should match after update")
t.Logf("Verified updated data: domain=%q, username=%q", updatedData.Domain, updatedData.Username)
// Delete entry
err = testClient.Entries.Folder.DeleteById(vault.Id, id)
require.NoError(t, err, "Failed to delete %s folder", subType)
// Verify deletion
_, err = testClient.Entries.Folder.GetById(vault.Id, id)
require.Error(t, err, "Entry should no longer exist after deletion")
})
}
}
func Test_NestedFolders(t *testing.T) {
vault := createTestVault(t, "nested-folders")
// Create parent folder at root
parentEntry := Entry{
VaultId: vault.Id,
Name: "Parent Folder",
Path: "",
Type: EntryFolderType,
SubType: EntryFolderSubTypeFolder,
Description: "Parent folder",
Data: &EntryFolderData{},
}
parentId, err := testClient.Entries.Folder.New(parentEntry)
require.NoError(t, err, "Failed to create parent folder")
t.Logf("Created parent folder with ID: %s", parentId)
// Fetch parent
parent, err := testClient.Entries.Folder.GetById(vault.Id, parentId)
require.NoError(t, err, "Failed to fetch parent folder")
t.Logf("Parent folder: Name=%q, Path=%q", parent.Name, parent.Path)
// Create child folder inside parent
childEntry := Entry{
VaultId: vault.Id,
Name: "Child Folder",
Path: parent.Name,
Type: EntryFolderType,
SubType: EntryFolderSubTypeServer,
Description: "Child folder inside parent",
Data: &EntryFolderData{},
}
childId, err := testClient.Entries.Folder.New(childEntry)
require.NoError(t, err, "Failed to create child folder")
t.Logf("Created child folder with ID: %s", childId)
// Fetch child and verify
child, err := testClient.Entries.Folder.GetById(vault.Id, childId)
require.NoError(t, err, "Failed to fetch child folder")
t.Logf("Child folder: Name=%q, Path=%q, SubType=%q", child.Name, child.Path, child.SubType)
assert.Equal(t, "Child Folder", child.Name)
assert.Equal(t, EntryFolderSubTypeServer, child.SubType)
// Create grandchild folder inside child
grandchildEntry := Entry{
VaultId: vault.Id,
Name: "Grandchild Folder",
Path: fmt.Sprintf("%s\\%s", parent.Name, child.Name),
Type: EntryFolderType,
SubType: EntryFolderSubTypeDatabase,
Description: "Grandchild folder inside child",
Data: &EntryFolderData{},
}
grandchildId, err := testClient.Entries.Folder.New(grandchildEntry)
require.NoError(t, err, "Failed to create grandchild folder")
t.Logf("Created grandchild folder with ID: %s", grandchildId)
// Fetch grandchild and verify
grandchild, err := testClient.Entries.Folder.GetById(vault.Id, grandchildId)
require.NoError(t, err, "Failed to fetch grandchild folder")
t.Logf("Grandchild folder: Name=%q, Path=%q, SubType=%q", grandchild.Name, grandchild.Path, grandchild.SubType)
assert.Equal(t, "Grandchild Folder", grandchild.Name)
assert.Equal(t, EntryFolderSubTypeDatabase, grandchild.SubType)
// Delete entries (in reverse order)
err = testClient.Entries.Folder.DeleteById(vault.Id, grandchildId)
require.NoError(t, err, "Failed to delete grandchild folder")
err = testClient.Entries.Folder.DeleteById(vault.Id, childId)
require.NoError(t, err, "Failed to delete child folder")
err = testClient.Entries.Folder.DeleteById(vault.Id, parentId)
require.NoError(t, err, "Failed to delete parent folder")
}
func Test_GetFolderByName(t *testing.T) {
vault := createTestVault(t, "folder-getbyname")
testPath := "go-dvls\\folder-getbyname"
entry := Entry{
VaultId: vault.Id,
Name: "MyFolder",
Path: testPath,
Type: EntryFolderType,
SubType: EntryFolderSubTypeFolder,
Data: &EntryFolderData{Domain: "test.local", Username: "testuser"},
}
id, err := testClient.Entries.Folder.New(entry)
require.NoError(t, err, "Failed to create folder entry")
t.Cleanup(func() {
_ = testClient.Entries.Folder.DeleteById(vault.Id, id)
})
// GetByName with name only
got, err := testClient.Entries.Folder.GetByName(vault.Id, "MyFolder", GetByNameOptions{Path: &testPath})
require.NoError(t, err)
assert.Equal(t, id, got.Id)
assert.Equal(t, "MyFolder", got.Name)
assert.Equal(t, testPath+`\MyFolder`, got.Path)
// GetByName with non-existent name returns ErrEntryNotFound
_, err = testClient.Entries.Folder.GetByName(vault.Id, "NonExistentFolder", GetByNameOptions{Path: &testPath})
assert.ErrorIs(t, err, ErrEntryNotFound)
// GetByName without path filter also finds the entry
got, err = testClient.Entries.Folder.GetByName(vault.Id, "MyFolder", GetByNameOptions{})
require.NoError(t, err)
assert.Equal(t, id, got.Id)
// Root-level folder: path returned by API is the folder name itself
rootEntry := Entry{
VaultId: vault.Id,
Name: "MyRootFolder",
Path: "",
Type: EntryFolderType,
SubType: EntryFolderSubTypeFolder,
Data: &EntryFolderData{},
}
rootId, err := testClient.Entries.Folder.New(rootEntry)
require.NoError(t, err)
t.Cleanup(func() {
_ = testClient.Entries.Folder.DeleteById(vault.Id, rootId)
})
root, err := testClient.Entries.Folder.GetByName(vault.Id, "MyRootFolder", GetByNameOptions{})
require.NoError(t, err)
assert.Equal(t, rootId, root.Id)
assert.Equal(t, "MyRootFolder", root.Path)
}
func Test_GetFolderEntries_Filters(t *testing.T) {
vault := createTestVault(t, "folder-getentries")
testPath := "go-dvls\\folder-getentries"
// Create 3 test folder entries - "Database" is exact match, others contain "Database" in name
entriesToCreate := []Entry{
{
VaultId: vault.Id,
Name: "Database",
Path: testPath,
Type: EntryFolderType,
SubType: EntryFolderSubTypeDatabase,
Description: "Exact match folder",
Data: &EntryFolderData{Domain: "db.local", Username: "dbuser"},
},
{
VaultId: vault.Id,
Name: "Database Backup",
Path: testPath,
Type: EntryFolderType,
SubType: EntryFolderSubTypeDatabase,
Description: "Contains Database in name",
Data: &EntryFolderData{Domain: "backup.local", Username: "backupuser"},
},
{
VaultId: vault.Id,
Name: "Database Production",
Path: testPath,
Type: EntryFolderType,
SubType: EntryFolderSubTypeDatabase,
Description: "Contains Database in name",
Data: &EntryFolderData{Domain: "prod.local", Username: "produser"},
},
}
// Create test entries
t.Log("Creating test folder entries for GetEntries")
var createdIds []string
for _, entry := range entriesToCreate {
id, err := testClient.Entries.Folder.New(entry)
require.NoError(t, err, "Failed to create folder entry %s", entry.Name)
createdIds = append(createdIds, id)
t.Logf("Created folder entry %q with ID: %s", entry.Name, id)
}
databaseName := "Database"
databaseBackupName := "Database Backup"
nonExistentName := "Non Existent Folder"
// Test 1: GetEntries with path filter should return at least our 3 folders
// Note: DVLS may auto-create parent folders, so we check for >= 3
t.Log("Test 1: GetEntries with path filter")
entries, err := testClient.Entries.Folder.GetEntries(vault.Id, GetEntriesOptions{Path: &testPath})
require.NoError(t, err, "GetEntries failed")
assert.GreaterOrEqual(t, len(entries), 3, "Expected at least 3 folder entries with path filter")
// Verify our 3 folders are present
foundNames := make(map[string]bool)
for _, e := range entries {
foundNames[e.Name] = true
}
assert.True(t, foundNames["Database"], "Expected to find 'Database' folder")
assert.True(t, foundNames["Database Backup"], "Expected to find 'Database Backup' folder")
assert.True(t, foundNames["Database Production"], "Expected to find 'Database Production' folder")
t.Logf("Found %d folder entries in path %q (including auto-created parent folders)", len(entries), testPath)
// Test 2: GetEntries with exact name match - should return only "Database"
t.Log("Test 2: GetEntries with exact name match")
entries, err = testClient.Entries.Folder.GetEntries(vault.Id, GetEntriesOptions{Name: &databaseName})
require.NoError(t, err, "GetEntries with exact name failed")
assert.Len(t, entries, 1, "Expected 1 folder entry with exact name match")
if len(entries) > 0 {
assert.Equal(t, "Database", entries[0].Name)
t.Logf("Found exact match: %q", entries[0].Name)
}
// Test 3: GetEntries with name and path filter
t.Log("Test 3: GetEntries with name and path filter")
entries, err = testClient.Entries.Folder.GetEntries(vault.Id, GetEntriesOptions{Name: &databaseBackupName, Path: &testPath})
require.NoError(t, err, "GetEntries with name and path filter failed")
assert.Len(t, entries, 1, "Expected 1 folder entry with name and path filter")
t.Logf("Found %d folder entry with combined filters", len(entries))
// Test 4: GetEntries with non-existent name should return empty
t.Log("Test 4: GetEntries with non-existent name")
entries, err = testClient.Entries.Folder.GetEntries(vault.Id, GetEntriesOptions{Name: &nonExistentName, Path: &testPath})
require.NoError(t, err, "GetEntries with non-existent name failed")
assert.Empty(t, entries, "Expected 0 folder entries for non-existent name")
t.Logf("Correctly returned %d folder entries for non-existent name", len(entries))
// Cleanup test entries
t.Log("Cleaning up test folder entries")
for _, id := range createdIds {
err := testClient.Entries.Folder.DeleteById(vault.Id, id)
require.NoError(t, err, "Failed to delete folder entry %s", id)
}
t.Log("Cleanup complete")
}