154 lines
4.3 KiB
Go
154 lines
4.3 KiB
Go
package persistence_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"gitlab.com/offline-twitter/twitter_offline_engine/pkg/scraper"
|
|
)
|
|
|
|
// Some types to spy on a MediaDownloader
|
|
type SpyResult struct {
|
|
url string
|
|
outpath string
|
|
}
|
|
|
|
// TODO: doesn't need to be a struct, can just be the spy; also, the pointer might be unnecessary
|
|
type FakeDownloader struct {
|
|
Spy *[]SpyResult
|
|
}
|
|
|
|
func NewFakeDownloader() FakeDownloader {
|
|
ret := FakeDownloader{}
|
|
ret.Spy = &[]SpyResult{}
|
|
return ret
|
|
}
|
|
func (d FakeDownloader) Curl(url string, outpath string) error {
|
|
*d.Spy = append(*d.Spy, SpyResult{url, outpath})
|
|
return nil
|
|
}
|
|
func (d FakeDownloader) Contains(result SpyResult) bool {
|
|
for _, r := range *d.Spy {
|
|
if r == result {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func test_all_downloaded(tweet scraper.Tweet, yes_or_no bool, t *testing.T) {
|
|
error_msg := map[bool]string{
|
|
true: "Expected to be downloaded, but it wasn't",
|
|
false: "Expected not to be downloaded, but it was",
|
|
}[yes_or_no]
|
|
|
|
assert.Len(t, tweet.Images, 2)
|
|
assert.Len(t, tweet.Videos, 1)
|
|
for _, img := range tweet.Images {
|
|
if img.IsDownloaded != yes_or_no {
|
|
t.Errorf("%s: ImageID %d", error_msg, img.ID)
|
|
}
|
|
}
|
|
for _, vid := range tweet.Videos {
|
|
if vid.IsDownloaded != yes_or_no {
|
|
t.Errorf("Expected not to be downloaded, but it was: VideoID %d", vid.ID)
|
|
}
|
|
}
|
|
if tweet.IsContentDownloaded != yes_or_no {
|
|
t.Errorf("%s: the tweet", error_msg)
|
|
}
|
|
}
|
|
|
|
// Downloading a Tweet's contents should mark the Tweet as downloaded
|
|
func TestDownloadTweetContent(t *testing.T) {
|
|
profile_path := "test_profiles/TestMediaQueries"
|
|
profile := create_or_load_profile(profile_path)
|
|
|
|
tweet := create_dummy_tweet()
|
|
|
|
// Persist the tweet
|
|
err := profile.SaveTweet(tweet)
|
|
require.NoError(t, err)
|
|
|
|
// Make sure everything is marked "not downloaded"
|
|
test_all_downloaded(tweet, false, t)
|
|
|
|
// Do the (fake) downloading
|
|
err = profile.DownloadTweetContentWithInjector(&tweet, NewFakeDownloader())
|
|
require.NoError(t, err)
|
|
|
|
// It should all be marked "yes downloaded" now
|
|
test_all_downloaded(tweet, true, t)
|
|
|
|
// Reload the Tweet (check db); should also be "yes downloaded"
|
|
new_tweet, err := profile.GetTweetById(tweet.ID)
|
|
require.NoError(t, err)
|
|
test_all_downloaded(new_tweet, true, t)
|
|
}
|
|
|
|
// Downloading a User's contents should mark the User as downloaded
|
|
func TestDownloadUserContent(t *testing.T) {
|
|
assert := assert.New(t)
|
|
profile_path := "test_profiles/TestMediaQueries"
|
|
profile := create_or_load_profile(profile_path)
|
|
|
|
user := create_dummy_user()
|
|
|
|
// Persist the User
|
|
err := profile.SaveUser(&user)
|
|
require.NoError(t, err)
|
|
|
|
// Make sure the User is marked "not downloaded"
|
|
assert.False(user.IsContentDownloaded)
|
|
|
|
// Do the (fake) downloading
|
|
fake_downloader := NewFakeDownloader()
|
|
err = profile.DownloadUserContentWithInjector(&user, fake_downloader)
|
|
require.NoError(t, err)
|
|
|
|
// Check that the downloader was called with the appropriate stuff
|
|
assert.Len(*fake_downloader.Spy, 2)
|
|
assert.True(fake_downloader.Contains(SpyResult{
|
|
"profile image url",
|
|
"test_profiles/TestMediaQueries/profile_images/profile image local path",
|
|
}))
|
|
assert.True(fake_downloader.Contains(SpyResult{
|
|
"banner image url",
|
|
"test_profiles/TestMediaQueries/profile_images/banner image local path",
|
|
}))
|
|
|
|
// The User should now be marked "yes downloaded"
|
|
assert.True(user.IsContentDownloaded)
|
|
|
|
// Reload the User (check db); should also be "yes downloaded"
|
|
new_user, err := profile.GetUserByID(user.ID)
|
|
require.NoError(t, err)
|
|
assert.True(new_user.IsContentDownloaded)
|
|
}
|
|
|
|
// Should download the right stuff if User has no banner image and default profile image
|
|
func TestDownloadDefaultUserContent(t *testing.T) {
|
|
assert := assert.New(t)
|
|
profile_path := "test_profiles/TestMediaQueries"
|
|
profile := create_or_load_profile(profile_path)
|
|
|
|
user := create_dummy_user()
|
|
user.BannerImageUrl = ""
|
|
user.BannerImageLocalPath = ""
|
|
user.ProfileImageUrl = ""
|
|
|
|
// Do the (fake) downloading
|
|
fake_downloader := NewFakeDownloader()
|
|
err := profile.DownloadUserContentWithInjector(&user, fake_downloader)
|
|
require.NoError(t, err)
|
|
|
|
// Check that the downloader was called with the appropriate stuff
|
|
assert.Len(*fake_downloader.Spy, 1)
|
|
assert.True(fake_downloader.Contains(SpyResult{
|
|
scraper.DEFAULT_PROFILE_IMAGE_URL,
|
|
"test_profiles/TestMediaQueries/profile_images/default_profile.png",
|
|
}))
|
|
}
|