412 lines
11 KiB
Go
412 lines
11 KiB
Go
package persistence_test
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"time"
|
|
|
|
. "gitlab.com/offline-twitter/twitter_offline_engine/pkg/persistence"
|
|
)
|
|
|
|
// Load a test profile, or create it if it doesn't exist.
|
|
func create_or_load_profile(profile_path string) Profile {
|
|
var profile Profile
|
|
var err error
|
|
|
|
if !file_exists(profile_path) {
|
|
profile, err = NewProfile(profile_path)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
u := create_stable_user()
|
|
err = profile.SaveUser(&u)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
err = profile.SaveTweet(create_stable_tweet())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
err = profile.SaveRetweet(create_stable_retweet())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
err = profile.SaveChatRoom(create_stable_chat_room())
|
|
} else {
|
|
profile, err = LoadProfile(profile_path)
|
|
}
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return profile
|
|
}
|
|
|
|
// Create a stable user with a fixed ID and handle
|
|
func create_stable_user() User {
|
|
return User{
|
|
ID: UserID(-1),
|
|
DisplayName: "stable display name",
|
|
Handle: UserHandle("handle stable"),
|
|
Bio: "stable bio",
|
|
FollowersCount: 10,
|
|
FollowingCount: 2000,
|
|
Location: "stable location",
|
|
Website: "stable website",
|
|
JoinDate: TimestampFromUnix(10000000),
|
|
IsVerified: true,
|
|
IsPrivate: false,
|
|
ProfileImageUrl: "stable profile image url",
|
|
ProfileImageLocalPath: "stable profile image local path",
|
|
BannerImageUrl: "stable banner image url",
|
|
BannerImageLocalPath: "stable image local path",
|
|
PinnedTweetID: TweetID(345),
|
|
}
|
|
}
|
|
|
|
// Create a semi-stable Image based on the given ID
|
|
func create_image_from_id(id int) Image {
|
|
filename := fmt.Sprintf("image%d.jpg", id)
|
|
return Image{
|
|
ID: ImageID(id),
|
|
TweetID: -1,
|
|
Width: id * 10,
|
|
Height: id * 5,
|
|
RemoteURL: filename,
|
|
LocalFilename: filename,
|
|
IsDownloaded: false,
|
|
}
|
|
}
|
|
|
|
// Create a semi-stable Video based on the given ID
|
|
func create_video_from_id(id int) Video {
|
|
filename := fmt.Sprintf("video%d.jpg", id)
|
|
return Video{
|
|
ID: VideoID(id),
|
|
TweetID: -1,
|
|
Width: id * 10,
|
|
Height: id * 5,
|
|
RemoteURL: filename,
|
|
LocalFilename: filename,
|
|
ThumbnailRemoteUrl: filename,
|
|
ThumbnailLocalPath: filename,
|
|
Duration: 10000,
|
|
ViewCount: 200,
|
|
IsDownloaded: false,
|
|
IsGif: false,
|
|
}
|
|
}
|
|
|
|
// Create a semi-stable Url based on the given ID
|
|
func create_url_from_id(id int) Url {
|
|
s := fmt.Sprint(id)
|
|
return Url{
|
|
TweetID: -1,
|
|
Domain: s + "domain",
|
|
Text: s + "text",
|
|
ShortText: s + "shorttext",
|
|
Title: s + "title",
|
|
Description: s + "description",
|
|
ThumbnailWidth: id * 23,
|
|
ThumbnailHeight: id * 7,
|
|
ThumbnailRemoteUrl: s + "remote url",
|
|
ThumbnailLocalPath: s + "local path",
|
|
CreatorID: UserID(id),
|
|
SiteID: UserID(id),
|
|
HasCard: true,
|
|
IsContentDownloaded: false,
|
|
}
|
|
}
|
|
|
|
// Create a semi-stable Poll based on the given ID
|
|
func create_poll_from_id(id int) Poll {
|
|
s := fmt.Sprint(id)
|
|
return Poll{
|
|
ID: PollID(id),
|
|
TweetID: -1,
|
|
NumChoices: 2,
|
|
Choice1: s,
|
|
Choice1_Votes: 1000,
|
|
Choice2: "Not " + s,
|
|
Choice2_Votes: 1500,
|
|
VotingDuration: 10,
|
|
VotingEndsAt: TimestampFromUnix(10000000),
|
|
LastUpdatedAt: TimestampFromUnix(10000),
|
|
}
|
|
}
|
|
|
|
// Create a stable tweet with a fixed ID and content
|
|
func create_stable_tweet() Tweet {
|
|
tweet_id := TweetID(-1)
|
|
return Tweet{
|
|
ID: tweet_id,
|
|
UserID: -1,
|
|
Text: "stable text",
|
|
PostedAt: TimestampFromUnix(10000000),
|
|
NumLikes: 10,
|
|
NumRetweets: 10,
|
|
NumReplies: 10,
|
|
NumQuoteTweets: 10,
|
|
Videos: []Video{
|
|
create_video_from_id(-1),
|
|
},
|
|
Urls: []Url{
|
|
create_url_from_id(-1),
|
|
},
|
|
Images: []Image{
|
|
create_image_from_id(-1),
|
|
},
|
|
Mentions: CommaSeparatedList{},
|
|
Hashtags: CommaSeparatedList{},
|
|
Polls: []Poll{
|
|
create_poll_from_id(-1),
|
|
},
|
|
Spaces: []Space{
|
|
create_space_from_id(-1),
|
|
},
|
|
SpaceID: SpaceID("some_id_-1"),
|
|
IsConversationScraped: true,
|
|
LastScrapedAt: TimestampFromUnix(100000000),
|
|
}
|
|
}
|
|
|
|
// Create a stable retweet with a fixed ID and parameters
|
|
func create_stable_retweet() Retweet {
|
|
retweet_id := TweetID(-1)
|
|
return Retweet{
|
|
RetweetID: retweet_id,
|
|
TweetID: -1,
|
|
RetweetedByID: -1,
|
|
RetweetedAt: TimestampFromUnix(20000000),
|
|
}
|
|
}
|
|
|
|
// Create a new user with a random ID and handle
|
|
func create_dummy_user() User {
|
|
userID := rand.Int()
|
|
|
|
return User{
|
|
ID: UserID(userID),
|
|
DisplayName: "display name",
|
|
Handle: UserHandle(fmt.Sprintf("handle%d", userID)),
|
|
Bio: "bio",
|
|
FollowersCount: 0,
|
|
FollowingCount: 1000,
|
|
Location: "location",
|
|
Website: "website",
|
|
JoinDate: Timestamp{time.Now().Truncate(1e9)}, // Round to nearest second
|
|
IsVerified: false,
|
|
IsPrivate: true,
|
|
ProfileImageUrl: "profile image url",
|
|
ProfileImageLocalPath: "profile image local path",
|
|
BannerImageUrl: "banner image url",
|
|
BannerImageLocalPath: "banner image local path",
|
|
PinnedTweetID: TweetID(234),
|
|
}
|
|
}
|
|
|
|
// Create a new tweet from the stable User, with a random ID and content
|
|
func create_dummy_tweet() Tweet {
|
|
tweet_id := TweetID(rand.Int())
|
|
|
|
img1 := create_image_from_id(rand.Int())
|
|
img1.TweetID = tweet_id
|
|
img2 := create_image_from_id(rand.Int())
|
|
img2.TweetID = tweet_id
|
|
vid := create_video_from_id(rand.Int())
|
|
vid.TweetID = tweet_id
|
|
|
|
url1 := create_url_from_id(rand.Int())
|
|
url1.TweetID = tweet_id
|
|
url2 := create_url_from_id(rand.Int())
|
|
url2.TweetID = tweet_id
|
|
|
|
poll := create_poll_from_id(rand.Int())
|
|
poll.TweetID = tweet_id
|
|
|
|
space := create_space_from_id(rand.Int())
|
|
space_id := space.ID
|
|
|
|
return Tweet{
|
|
ID: tweet_id,
|
|
UserID: create_stable_user().ID,
|
|
Text: "text",
|
|
PostedAt: Timestamp{time.Now().Truncate(1e9)}, // Round to nearest second
|
|
NumLikes: 1,
|
|
NumRetweets: 2,
|
|
NumReplies: 3,
|
|
NumQuoteTweets: 4,
|
|
Videos: []Video{vid},
|
|
Urls: []Url{url1, url2},
|
|
Images: []Image{img1, img2},
|
|
Mentions: CommaSeparatedList{"mention1", "mention2"},
|
|
ReplyMentions: CommaSeparatedList{"replymention1", "replymention2"},
|
|
Hashtags: CommaSeparatedList{"hash1", "hash2"},
|
|
Polls: []Poll{poll},
|
|
Spaces: []Space{space},
|
|
SpaceID: space_id,
|
|
}
|
|
}
|
|
|
|
// Create a random tombstone
|
|
func create_dummy_tombstone() Tweet {
|
|
tweet_id := TweetID(rand.Int())
|
|
|
|
return Tweet{
|
|
ID: tweet_id,
|
|
UserID: -1,
|
|
TombstoneType: "deleted",
|
|
IsStub: true,
|
|
Mentions: CommaSeparatedList{},
|
|
ReplyMentions: CommaSeparatedList{},
|
|
Hashtags: CommaSeparatedList{},
|
|
Spaces: []Space{},
|
|
}
|
|
}
|
|
|
|
// Create a new retweet with a random ID for a given TweetID
|
|
func create_dummy_retweet(tweet_id TweetID) Retweet {
|
|
retweet_id := TweetID(rand.Int())
|
|
|
|
return Retweet{
|
|
RetweetID: retweet_id,
|
|
TweetID: tweet_id,
|
|
RetweetedByID: -1,
|
|
RetweetedAt: TimestampFromUnix(20000000),
|
|
}
|
|
}
|
|
|
|
// Create a semi-stable Space given an ID
|
|
func create_space_from_id(id int) Space {
|
|
return Space{
|
|
ID: SpaceID(fmt.Sprintf("some_id_%d", id)),
|
|
ShortUrl: fmt.Sprintf("short_url_%d", id),
|
|
State: "Running",
|
|
Title: "Some Title",
|
|
CreatedAt: TimestampFromUnix(1000),
|
|
StartedAt: TimestampFromUnix(2000),
|
|
EndedAt: TimestampFromUnix(3000),
|
|
UpdatedAt: TimestampFromUnix(4000),
|
|
CreatedById: -1,
|
|
ParticipantIds: []UserID{-1},
|
|
}
|
|
}
|
|
|
|
func create_dummy_like() Like {
|
|
return Like{
|
|
TweetID: create_stable_tweet().ID,
|
|
UserID: create_stable_user().ID,
|
|
SortID: LikeSortID(12345),
|
|
}
|
|
}
|
|
|
|
func create_dummy_bookmark() Bookmark {
|
|
return Bookmark{
|
|
TweetID: create_stable_tweet().ID,
|
|
UserID: create_stable_user().ID,
|
|
SortID: BookmarkSortID(12345),
|
|
}
|
|
}
|
|
|
|
func create_stable_chat_room() DMChatRoom {
|
|
id := DMChatRoomID("some chat room ID")
|
|
|
|
return DMChatRoom{
|
|
ID: id,
|
|
Type: "ONE_ON_ONE",
|
|
LastMessagedAt: TimestampFromUnix(123),
|
|
IsNSFW: false,
|
|
Participants: map[UserID]DMChatParticipant{
|
|
UserID(-1): {
|
|
DMChatRoomID: id,
|
|
UserID: UserID(-1),
|
|
LastReadEventID: DMMessageID(0),
|
|
IsChatSettingsValid: true,
|
|
IsNotificationsDisabled: false,
|
|
IsMentionNotificationsDisabled: false,
|
|
IsReadOnly: false,
|
|
IsTrusted: true,
|
|
IsMuted: false,
|
|
Status: "some status",
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func create_dummy_chat_room() DMChatRoom {
|
|
id := DMChatRoomID(fmt.Sprintf("Chat Room #%d", rand.Int()))
|
|
|
|
return DMChatRoom{
|
|
ID: id,
|
|
Type: "ONE_ON_ONE",
|
|
LastMessagedAt: TimestampFromUnix(10000),
|
|
IsNSFW: false,
|
|
Participants: map[UserID]DMChatParticipant{
|
|
UserID(-1): {
|
|
DMChatRoomID: id,
|
|
UserID: UserID(-1),
|
|
LastReadEventID: DMMessageID(0),
|
|
IsChatSettingsValid: true,
|
|
IsNotificationsDisabled: false,
|
|
IsMentionNotificationsDisabled: false,
|
|
IsReadOnly: false,
|
|
IsTrusted: true,
|
|
IsMuted: false,
|
|
Status: "some status",
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func create_dummy_chat_message() DMMessage {
|
|
id := DMMessageID(rand.Int())
|
|
vid := create_video_from_id(int(id))
|
|
vid.TweetID = TweetID(0)
|
|
vid.DMMessageID = id
|
|
img := create_image_from_id(int(id))
|
|
img.TweetID = TweetID(0)
|
|
img.DMMessageID = id
|
|
url := create_url_from_id(int(id))
|
|
url.TweetID = TweetID(0)
|
|
url.DMMessageID = id
|
|
return DMMessage{
|
|
ID: id,
|
|
DMChatRoomID: create_stable_chat_room().ID,
|
|
SenderID: create_stable_user().ID,
|
|
SentAt: TimestampFromUnix(50000),
|
|
RequestID: "fwjefkj",
|
|
Text: fmt.Sprintf("This is message #%d", id),
|
|
Reactions: map[UserID]DMReaction{
|
|
UserID(-1): {
|
|
ID: id + 1,
|
|
DMMessageID: id,
|
|
SenderID: UserID(-1),
|
|
SentAt: TimestampFromUnix(51000),
|
|
Emoji: "🤔",
|
|
},
|
|
},
|
|
Videos: []Video{vid},
|
|
Images: []Image{img},
|
|
Urls: []Url{url},
|
|
}
|
|
}
|
|
|
|
func create_dummy_notification() Notification {
|
|
id := NotificationID(fmt.Sprintf("Notification #%d", rand.Int()))
|
|
|
|
return Notification{
|
|
ID: id,
|
|
Type: NOTIFICATION_TYPE_REPLY,
|
|
SentAt: TimestampFromUnix(10000),
|
|
SortIndex: rand.Int63(),
|
|
UserID: create_stable_user().ID,
|
|
ActionUserID: create_stable_user().ID,
|
|
ActionTweetID: create_stable_tweet().ID,
|
|
ActionRetweetID: create_stable_retweet().RetweetID,
|
|
HasDetail: true,
|
|
LastScrapedAt: TimestampFromUnix(57234728),
|
|
TweetIDs: []TweetID{create_stable_tweet().ID},
|
|
UserIDs: []UserID{create_stable_user().ID},
|
|
RetweetIDs: []TweetID{create_stable_retweet().RetweetID},
|
|
}
|
|
}
|