package model

import (
	"github.com/DATA-DOG/go-sqlmock"
	"github.com/stretchr/testify/assert"
	"testing"
)

func TestSourceLink_Link(t *testing.T) {
	a := assert.New(t)
	s := &SourceLink{}
	s.ID = 1

	// 失败
	{
		s.File.Name = string([]byte{0x7f})
		res, err := s.Link()
		a.Error(err)
		a.Empty(res)
	}

	// 成功
	{
		s.File.Name = "filename"
		res, err := s.Link()
		a.NoError(err)
		a.Contains(res, s.Name)
	}
}

func TestGetSourceLinkByID(t *testing.T) {
	a := assert.New(t)
	mock.ExpectQuery("SELECT(.+)source_links(.+)").WithArgs(1).WillReturnRows(sqlmock.NewRows([]string{"id", "file_id"}).AddRow(1, 2))
	mock.ExpectQuery("SELECT(.+)files(.+)").WithArgs(2).WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(2))

	res, err := GetSourceLinkByID(1)
	a.NoError(err)
	a.NotNil(res)
	a.EqualValues(2, res.File.ID)
	a.NoError(mock.ExpectationsWereMet())
}

func TestSourceLink_Downloaded(t *testing.T) {
	a := assert.New(t)
	s := &SourceLink{}
	s.ID = 1
	mock.ExpectBegin()
	mock.ExpectExec("UPDATE(.+)source_links(.+)").WillReturnResult(sqlmock.NewResult(1, 1))
	mock.ExpectCommit()
	s.Downloaded()
	a.NoError(mock.ExpectationsWereMet())
}