продолжаю тестирование

main
parent a640cd0b89
commit 8797303d86

@ -0,0 +1,56 @@
package pic
import (
"fmt"
"os"
"reflect"
"testing"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
// Это скорее интеграционное тестированиеЮ чем модульное
// Сначала создадим тестовую БД - test-sea аналог боевой
// Выполняется один раз при прогоне
func TextMain(m *testing.M) {
db = createTestDB()
os.Exit(m.Run())
}
func createTestDB() *sqlx.DB {
db, err := sqlx.Open("mysql", "itman:X753951x@(xigmanas:3306)")
if err != nil {
fmt.Printf("не удалось полключиться к БД: %v\n", err)
os.Exit(0)
}
return db
}
func Test_getAlbum(t *testing.T) {
type args struct {
db *sqlx.DB
name string
}
tests := []struct {
name string
args args
want []Picture
wantErr bool
}{
// TODO: Add test cases.
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := getAlbum(tt.args.db, tt.args.name)
if (err != nil) != tt.wantErr {
t.Errorf("getAlbum() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("getAlbum() = %v, want %v", got, tt.want)
}
})
}
}

@ -3,6 +3,8 @@ package pic
import ( import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log"
"os"
"regexp" "regexp"
"strings" "strings"
@ -68,9 +70,12 @@ type WebpFile struct {
height string height string
} }
// конвертация из .gif в .webp с изменением размеров файла // конвертация из .gif в .webp с изменением размера файла
// filename - исходный файл gif // с использованием программы ffmpeg.
func convert(filename string) (WebpFile, error) { // filename - исходный файл gif (полный путь)
// Возвращает описание выходного файла WebpFile
// Выходной файл находится рядом с исходным
func convertFile(filename string) (WebpFile, error) {
webpfile := WebpFile{} webpfile := WebpFile{}
cmd, webp, err := cmdFfmpeg(filename) cmd, webp, err := cmdFfmpeg(filename)
@ -100,6 +105,32 @@ func convert(filename string) (WebpFile, error) {
return webpfile, nil return webpfile, nil
} }
// Экспорт функции конвертации
func Convert(filename string) error {
webp, err := convertFile(filename)
if err != nil {
return err
}
log.Printf("[%sx%s] %s\n", webp.width, webp.height, webp.filename)
// все сделано, удалим исходный и выходной файл
if err := deleteFile(filename); err != nil {
return err
}
if err := deleteFile(webp.filename); err != nil {
return err
}
return nil
}
func deleteFile(filename string) error {
err := os.Remove(filename)
return err
}
// получает размер файла из вывода команды ffmpeg // получает размер файла из вывода команды ffmpeg
// если пустая строка - бросаем панику // если пустая строка - бросаем панику
func getSize(out string) (string, string) { func getSize(out string) (string, string) {

@ -58,22 +58,35 @@ func TestGetSize(t *testing.T) {
assert.Equal(t, h, "1980", "должны быть 1980") assert.Equal(t, h, "1980", "должны быть 1980")
} }
func TestConvert(t *testing.T) { func TestConvertFile(t *testing.T) {
// предварительно скопируем тестовый файл во временный каталог // предварительно скопируем тестовый файл во временный каталог
tmpgif := "test.gif" tmpgif := "test.gif"
require.FileExists(t, tmpgif) require.FileExists(t, tmpgif)
// создадим временный каталог
tmpdir := t.TempDir() tmpdir := t.TempDir()
filename := filepath.Join(tmpdir, tmpgif) filename := filepath.Join(tmpdir, tmpgif)
// скопируем исходный файл в этот каталог
err := copyFile(tmpgif, filename) err := copyFile(tmpgif, filename)
require.NoError(t, err) require.NoError(t, err)
require.FileExists(t, filename) require.FileExists(t, filename)
webp, err := convert(filename) // собственно конвертация
webp, err := convertFile(filename)
assert.NoError(t, err) assert.NoError(t, err)
require.FileExists(t, webp.filename) require.FileExists(t, webp.filename)
// скопируем обратно, что бы посмотреть, что получилось // скопируем обратно, что бы посмотреть, что получилось
err = copyFile(webp.filename, "d:/projects/pic/test.webp") // err = copyFile(webp.filename, "d:/projects/pic/test.webp")
// assert.NoError(t, err)
}
func TestConvert(t *testing.T) {
// проверяем, что после конвертации файлы удаляются
tmpgif := "test.gif"
require.FileExists(t, tmpgif)
err := Convert(tmpgif)
assert.NoError(t, err) assert.NoError(t, err)
} }

@ -1,6 +1,8 @@
package pic package pic
import ( import (
"fmt"
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"
) )
@ -10,6 +12,9 @@ type SeaDB struct {
} }
func NewSeaDB(db *sqlx.DB) (*SeaDB, error) { func NewSeaDB(db *sqlx.DB) (*SeaDB, error) {
if db == nil {
return nil, fmt.Errorf("db = nil")
}
seadb := SeaDB{db: db} seadb := SeaDB{db: db}
return &seadb, nil return &seadb, nil
} }
@ -28,8 +33,6 @@ func (sea *SeaDB) SmallGifs() ([]string, error) {
and del = 0 and del = 0
and filemeta.converted = 0 and filemeta.converted = 0
and pic.width < 400 and pic.width < 400
LIMIT
10;
` `
var urls []string var urls []string
err := sea.db.Select(&urls, cmd) err := sea.db.Select(&urls, cmd)

@ -3,7 +3,6 @@ package pic
import ( import (
"os" "os"
"path/filepath" "path/filepath"
"strings"
"testing" "testing"
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"
@ -11,49 +10,56 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
var db = openDB() var db *sqlx.DB
func openDB() *sqlx.DB { func openDB() *sqlx.DB {
db, err := sqlx.Open("mysql", "itman:X753951x@(xigmanas:3306)/sea") db, err := sqlx.Open("mysql", "itman:X753951x@(xigmanas:3306)/sea-test")
if err != nil { if err != nil {
panic(err) panic(err)
} }
return db return db
} }
// создадим временный каталог для тестирования // Первоначальная установка окружения
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
os.RemoveAll("test") // Каталог test должен присутствовать и в нем должны находиться:
os.Mkdir("test", 0666) // sea-test.sql - скрипт для создания тестовой БД и заполнения ее тестовыми данными (mock)
// test.gif - тестовый gif (mock)
//os.RemoveAll("test")
//os.Mkdir("test", 0666)
db = openDB()
os.Exit(m.Run()) os.Exit(m.Run())
} }
func TestGetSmallGifs(t *testing.T) { func TestGetSmallGifs(t *testing.T) {
// db открыта на глобальном уровне
seadb, err := NewSeaDB(db) seadb, err := NewSeaDB(db)
// если ошибка - дальнейшая проверка бессмыслена // если ошибка - дальнейшая проверка бессмыслена
require.NoError(t, err) require.NoError(t, err)
urls, err := seadb.SmallGifs() urls, err := seadb.SmallGifs()
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, len(urls), 10, "должны получить ровно 10 записей")
// теперь проверяем правильность формата url // из тестовой БД должны получить 3 записи
// должны быть в форме: http://192.168.0.105:9091/4,530f8ea86e3e.gif assert.Equal(t, len(urls), 3, "должны получить ровно 3 записи")
for _, u := range urls { }
assert.Equal(t, strings.HasPrefix(u, "http://192.168.0.105:9091/"), true, "должен начинаться с http://192.168.0.105:9091/")
assert.Equal(t, strings.HasSuffix(u, ".gif"), true, "должен заканчиваться на .gif")
}
// проверим загрузку // Проверка загрузки из weed
url := urls[1] func TestDownload(t *testing.T) {
// fid := baseName() // для удобства - теперь вместо assert(t...) пишем просто assert(..)
filename, err := getFilename(url) assert := assert.New(t)
assert.Nil(t, err) url := "http://192.168.0.105:9090/1,15df3bf5a2b6cb"
tmpdir := t.TempDir()
err = download(url, filepath.Join("test", filename)) // формируем полное имя файла с путем.
assert.Nil(t, err) filename := filepath.Join(tmpdir, "1,15df3bf5a2b6cb")
err := download(url, filename)
assert.Nil(err)
assert.FileExists(filename)
} }
// Работает, но не понятно как интерпретировать результаты
func BenchmarkDownload(b *testing.B) { func BenchmarkDownload(b *testing.B) {
seadb, err := NewSeaDB(db) seadb, err := NewSeaDB(db)
if err != nil { if err != nil {

@ -29,7 +29,7 @@ func init() {
} }
} }
// загружает файл filename на weed и возвращает url загруженного файла // загружает файл filename на weed сервер и возвращает url загруженного файла
func upload(filename string) (string, error) { func upload(filename string) (string, error) {
fid, err := sw.Submit(filename, "", "") fid, err := sw.Submit(filename, "", "")
if err != nil { if err != nil {
@ -50,6 +50,7 @@ func delete(url string) error {
} }
// загружает файл из weed в filename // загружает файл из weed в filename
// filename должен содержать полный путь
func download(url string, filename string) error { func download(url string, filename string) error {
fid, err := getFID(url) fid, err := getFID(url)
if err != nil { if err != nil {
@ -66,6 +67,7 @@ func download(url string, filename string) error {
if err != nil { if err != nil {
return err return err
} }
_, err = file.Write(data) _, err = file.Write(data)
if err != nil { if err != nil {
return err return err
@ -86,6 +88,8 @@ func getFID(url string) (string, error) {
return items[len(items)-1], nil return items[len(items)-1], nil
} }
// возвращает имя файла из url без номера volume
// т.е. http://192.168.0.105:9090/1,15df3bf5a2b6cb => 15df3bf5a2b6cb
func getFilename(url string) (string, error) { func getFilename(url string) (string, error) {
fn, err := getFID(url) fn, err := getFID(url)
if err != nil { if err != nil {

Loading…
Cancel
Save