mirror of
https://github.com/v1k45/pastepass.git
synced 2025-12-23 06:15:48 +00:00
150 lines
3.3 KiB
Go
150 lines
3.3 KiB
Go
package db
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/boltdb/bolt"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestNewPaste(t *testing.T) {
|
|
db, err := NewTestDB()
|
|
assert.NoError(t, err)
|
|
defer db.Reset()
|
|
|
|
paste, err := db.NewPaste("test paste", time.Now().Add(time.Hour))
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, paste)
|
|
assert.NotEmpty(t, paste.ID)
|
|
assert.NotEmpty(t, paste.EncryptedBytes)
|
|
|
|
_, err = db.Get(paste.ID)
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
func TestGet(t *testing.T) {
|
|
db, err := NewTestDB()
|
|
assert.NoError(t, err)
|
|
defer db.Reset()
|
|
|
|
expirationTime := time.Now().Add(time.Hour)
|
|
paste, err := db.NewPaste("test paste", expirationTime)
|
|
assert.NoError(t, err)
|
|
|
|
t.Run("returns correct attributes", func(t *testing.T) {
|
|
// only metadata is returned for Get
|
|
savedPaste, err := db.Get(paste.ID)
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, paste.ID, savedPaste.ID)
|
|
assert.Empty(t, savedPaste.Text)
|
|
assert.Empty(t, savedPaste.EncryptedBytes)
|
|
assert.Equal(t, expirationTime.Unix(), savedPaste.ExpiresAt.Unix())
|
|
})
|
|
|
|
t.Run("non existent paste", func(t *testing.T) {
|
|
// Test nonexistent paste
|
|
_, err = db.Get("nonexistent")
|
|
assert.Error(t, err)
|
|
})
|
|
|
|
t.Run("expired paste", func(t *testing.T) {
|
|
// Test expired paste
|
|
paste, err = db.NewPaste("test paste", time.Now().Add(-time.Hour))
|
|
assert.NoError(t, err)
|
|
|
|
_, err = db.Get(paste.ID)
|
|
assert.Error(t, err)
|
|
})
|
|
}
|
|
|
|
func TestDelete(t *testing.T) {
|
|
db, err := NewTestDB()
|
|
assert.NoError(t, err)
|
|
defer db.Reset()
|
|
|
|
paste, err := db.NewPaste("test paste", time.Now().Add(time.Hour))
|
|
assert.NoError(t, err)
|
|
|
|
err = db.Delete(paste.ID)
|
|
assert.NoError(t, err)
|
|
|
|
_, err = db.Get(paste.ID)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestDecrypt(t *testing.T) {
|
|
db, err := NewTestDB()
|
|
assert.NoError(t, err)
|
|
defer db.Reset()
|
|
|
|
t.Run("decrypt paste", func(t *testing.T) {
|
|
paste, err := db.NewPaste("test paste", time.Now().Add(time.Hour))
|
|
assert.NoError(t, err)
|
|
|
|
// decrypt paste
|
|
decryptedText, err := db.Decrypt(paste.ID, paste.Key)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, "test paste", decryptedText)
|
|
|
|
// paste is deleted after decryption
|
|
_, err = db.Get(paste.ID)
|
|
assert.Error(t, err)
|
|
})
|
|
|
|
t.Run("invalid paste", func(t *testing.T) {
|
|
paste, err := db.NewPaste("test paste", time.Now().Add(time.Hour))
|
|
assert.NoError(t, err)
|
|
|
|
// test wrong key
|
|
_, err = db.Decrypt(paste.ID, "wrong key")
|
|
assert.Error(t, err)
|
|
|
|
_, err = db.Decrypt("nonexistent", "key")
|
|
assert.Error(t, err)
|
|
})
|
|
|
|
t.Run("expired paste", func(t *testing.T) {
|
|
paste, err := db.NewPaste("test paste", time.Now().Add(-time.Hour))
|
|
assert.NoError(t, err)
|
|
|
|
decryptedText, err := db.Decrypt(paste.ID, paste.Key)
|
|
assert.Empty(t, decryptedText)
|
|
assert.Error(t, err)
|
|
})
|
|
}
|
|
|
|
func TestDeleteExpired(t *testing.T) {
|
|
db, err := NewTestDB()
|
|
assert.NoError(t, err)
|
|
defer db.Reset()
|
|
|
|
_, err = db.NewPaste("test paste", time.Now().Add(time.Hour))
|
|
assert.NoError(t, err)
|
|
|
|
_, err = db.NewPaste("test paste", time.Now().Add(-time.Hour))
|
|
assert.NoError(t, err)
|
|
|
|
err = db.DeleteExpired()
|
|
assert.NoError(t, err)
|
|
|
|
pasteCount := 0
|
|
db.boltDB.View(func(tx *bolt.Tx) error {
|
|
bucket := tx.Bucket(pastesBucketName)
|
|
if bucket == nil {
|
|
return nil
|
|
}
|
|
|
|
cursor := bucket.Cursor()
|
|
for k, _ := cursor.First(); k != nil; k, _ = cursor.Next() {
|
|
pasteCount++
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
assert.Equal(t, 1, pasteCount)
|
|
}
|