fix tests

This commit is contained in:
Valentine 2024-02-20 23:27:22 +03:00
parent 6a5df36aed
commit cc633cb1ea
6 changed files with 214 additions and 138 deletions

2
.gitignore vendored
View file

@ -1,3 +1,5 @@
*.htm? *.htm?
*.json *.json
.idea/ .idea/
!.vscode/settings.json

7
api.go
View file

@ -105,3 +105,10 @@ func (s *Scraper) GetGuestToken() error {
return nil return nil
} }
func (s *Scraper) ClearGuestToken() error {
s.guestToken = ""
s.guestCreatedAt = time.Time{}
return nil
}

View file

@ -2,12 +2,11 @@ package twitterscraper_test
import ( import (
"testing" "testing"
twitterscraper "github.com/imperatrona/twitter-scraper"
) )
func TestGetGuestToken(t *testing.T) { func TestGetGuestToken(t *testing.T) {
scraper := twitterscraper.New() scraper := newTestScraper(true)
if err := scraper.GetGuestToken(); err != nil { if err := scraper.GetGuestToken(); err != nil {
t.Errorf("getGuestToken() error = %v", err) t.Errorf("getGuestToken() error = %v", err)
} }
@ -15,3 +14,13 @@ func TestGetGuestToken(t *testing.T) {
t.Error("Expected non-empty guestToken") t.Error("Expected non-empty guestToken")
} }
} }
func TestClearGuestToken(t *testing.T) {
scraper := newTestScraper(false)
scraper.ClearGuestToken()
if scraper.IsGuestToken() {
t.Error("Expected empty guestToken")
}
}

View file

@ -1,47 +1,97 @@
package twitterscraper_test package twitterscraper_test
import ( import (
"encoding/json"
"fmt" "fmt"
"net/http"
"os" "os"
"strings"
"testing" "testing"
twitterscraper "github.com/imperatrona/twitter-scraper" twitterscraper "github.com/imperatrona/twitter-scraper"
) )
var ( var (
proxy = os.Getenv("PROXY")
proxyRequired = os.Getenv("PROXY_REQUIRED") != ""
authToken = os.Getenv("AUTH_TOKEN")
ct0 = os.Getenv("CT0")
cookies = os.Getenv("COOKIES")
username = os.Getenv("TWITTER_USERNAME") username = os.Getenv("TWITTER_USERNAME")
password = os.Getenv("TWITTER_PASSWORD") password = os.Getenv("TWITTER_PASSWORD")
email = os.Getenv("TWITTER_EMAIL") email = os.Getenv("TWITTER_EMAIL")
skipAuthTest = os.Getenv("SKIP_AUTH_TEST") != "" skipAuthTest = os.Getenv("SKIP_AUTH_TEST") != ""
testScraper = twitterscraper.New() testScraper = newTestScraper(false)
) )
func init() { func init() {
if username != "" && password != "" && !skipAuthTest { if skipAuthTest {
return
}
if authToken != "" && ct0 != "" {
testScraper.SetAuthToken(authToken, ct0)
if !testScraper.IsLoggedIn() {
panic("Invalid AuthToken")
}
return
}
if cookies != "" {
var parsedCookies []*http.Cookie
json.NewDecoder(strings.NewReader(cookies)).Decode(&parsedCookies)
testScraper.SetCookies(parsedCookies)
if !testScraper.IsLoggedIn() {
panic("Invalid Cookies")
}
return
}
if username != "" && password != "" {
err := testScraper.Login(username, password, email) err := testScraper.Login(username, password, email)
if err != nil { if err != nil {
panic(fmt.Sprintf("Login() error = %v", err)) panic(fmt.Sprintf("Login() error = %v", err))
} }
return
}
panic("None of any auth data provided, provide any variables or set SKIP_AUTH_TEST.")
}
func newTestScraper(skip_auth bool) *twitterscraper.Scraper {
s := twitterscraper.New()
if proxy != "" && proxyRequired {
err := s.SetProxy(proxy)
if err != nil {
panic(fmt.Sprintf("SetProxy() error = %v", err))
} }
} }
func TestAuth(t *testing.T) { // Check connection by getting guest token
if skipAuthTest { if err := s.GetGuestToken(); err != nil {
panic(fmt.Sprintf("cannot get guest token, can also be error with connection to twitter.\n %v", err))
}
if skip_auth == true || !skipAuthTest {
s.ClearGuestToken()
return s
}
return s
}
func TestLoginPassword(t *testing.T) {
if skipAuthTest || username == "" || password == "" {
t.Skip("Skipping test due to environment variable") t.Skip("Skipping test due to environment variable")
} }
scraper := twitterscraper.New() scraper := newTestScraper(true)
if err := scraper.Login(username, password, email); err != nil { if err := scraper.Login(username, password, email); err != nil {
t.Fatalf("Login() error = %v", err) t.Fatalf("Login() error = %v", err)
} }
if !scraper.IsLoggedIn() { if !scraper.IsLoggedIn() {
t.Fatalf("Expected IsLoggedIn() = true") t.Fatalf("Expected IsLoggedIn() = true")
} }
cookies := scraper.GetCookies()
scraper2 := twitterscraper.New()
scraper2.SetCookies(cookies)
if !scraper2.IsLoggedIn() {
t.Error("Expected restored IsLoggedIn() = true")
}
if err := scraper.Logout(); err != nil { if err := scraper.Logout(); err != nil {
t.Errorf("Logout() error = %v", err) t.Errorf("Logout() error = %v", err)
} }
@ -50,7 +100,41 @@ func TestAuth(t *testing.T) {
} }
} }
func TestLoginToken(t *testing.T) {
if skipAuthTest || authToken == "" || ct0 == "" {
t.Skip("Skipping test due to environment variable")
}
scraper := newTestScraper(true)
scraper.SetAuthToken(authToken, ct0)
if !scraper.IsLoggedIn() {
t.Error("Expected IsLoggedIn() = true")
}
}
func TestLoginCookie(t *testing.T) {
if skipAuthTest || cookies == "" {
t.Skip("Skipping test due to environment variable")
}
scraper := newTestScraper(true)
var c []*http.Cookie
json.NewDecoder(strings.NewReader(cookies)).Decode(&c)
scraper.SetCookies(c)
if !scraper.IsLoggedIn() {
t.Error("Expected IsLoggedIn() = true")
}
}
func TestLoginOpenAccount(t *testing.T) { func TestLoginOpenAccount(t *testing.T) {
if os.Getenv("TEST_OPEN_ACCOUNT") == "" {
t.Skip("Skipping test due to environment variable")
}
scraper := twitterscraper.New() scraper := twitterscraper.New()
_, err := scraper.LoginOpenAccount() _, err := scraper.LoginOpenAccount()

View file

@ -2,6 +2,7 @@ package twitterscraper_test
import ( import (
"fmt" "fmt"
"strings"
"testing" "testing"
"time" "time"
@ -30,12 +31,7 @@ func TestGetProfile(t *testing.T) {
Website: "https://nomadic.name", Website: "https://nomadic.name",
} }
scraper := twitterscraper.New() profile, err := testScraper.GetProfile("nomadic_ua")
_, err := scraper.LoginOpenAccount()
if err != nil {
t.Fatalf("LoginOpenAccount() error = %v", err)
}
profile, err := scraper.GetProfile("nomadic_ua")
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
@ -86,13 +82,8 @@ func TestGetProfilePrivate(t *testing.T) {
Website: "", Website: "",
} }
scraper := twitterscraper.New()
_, err := scraper.LoginOpenAccount()
if err != nil {
t.Fatalf("LoginOpenAccount() error = %v", err)
}
// some random private profile (found via google) // some random private profile (found via google)
profile, err := scraper.GetProfile("tomdumont") profile, err := testScraper.GetProfile("tomdumont")
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
@ -121,17 +112,12 @@ func TestGetProfilePrivate(t *testing.T) {
} }
func TestGetProfileErrorSuspended(t *testing.T) { func TestGetProfileErrorSuspended(t *testing.T) {
scraper := twitterscraper.New() _, err := testScraper.GetProfile("123")
_, err := scraper.LoginOpenAccount()
if err != nil {
t.Fatalf("LoginOpenAccount() error = %v", err)
}
_, err = scraper.GetProfile("123")
if err == nil { if err == nil {
t.Error("Expected Error, got success") t.Error("Expected Error, got success")
} else { } else {
if err.Error() != "Authorization: User has been suspended. (63)" { if !strings.Contains(err.Error(), "Missing LdapGroup(visibility-custom-suspension)") {
t.Errorf("Expected error 'Authorization: User has been suspended. (63)', got '%s'", err) t.Error("Expected error to contain 'Missing LdapGroup(visibility-custom-suspension)', got", err)
} }
} }
} }
@ -139,12 +125,7 @@ func TestGetProfileErrorSuspended(t *testing.T) {
func TestGetProfileErrorNotFound(t *testing.T) { func TestGetProfileErrorNotFound(t *testing.T) {
neUser := "sample3123131" neUser := "sample3123131"
expectedError := fmt.Sprintf("User '%s' not found", neUser) expectedError := fmt.Sprintf("User '%s' not found", neUser)
scraper := twitterscraper.New() _, err := testScraper.GetProfile(neUser)
_, err := scraper.LoginOpenAccount()
if err != nil {
t.Fatalf("LoginOpenAccount() error = %v", err)
}
_, err = scraper.GetProfile(neUser)
if err == nil { if err == nil {
t.Error("Expected Error, got success") t.Error("Expected Error, got success")
} else { } else {
@ -155,12 +136,7 @@ func TestGetProfileErrorNotFound(t *testing.T) {
} }
func TestGetUserIDByScreenName(t *testing.T) { func TestGetUserIDByScreenName(t *testing.T) {
scraper := twitterscraper.New() userID, err := testScraper.GetUserIDByScreenName("Twitter")
_, err := scraper.LoginOpenAccount()
if err != nil {
t.Fatalf("LoginOpenAccount() error = %v", err)
}
userID, err := scraper.GetUserIDByScreenName("Twitter")
if err != nil { if err != nil {
t.Errorf("getUserByScreenName() error = %v", err) t.Errorf("getUserByScreenName() error = %v", err)
} }

View file

@ -3,7 +3,6 @@ package twitterscraper_test
import ( import (
"context" "context"
"testing" "testing"
"time"
"github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts" "github.com/google/go-cmp/cmp/cmpopts"
@ -14,18 +13,18 @@ var cmpOptions = cmp.Options{
cmpopts.IgnoreFields(twitterscraper.Tweet{}, "Likes"), cmpopts.IgnoreFields(twitterscraper.Tweet{}, "Likes"),
cmpopts.IgnoreFields(twitterscraper.Tweet{}, "Replies"), cmpopts.IgnoreFields(twitterscraper.Tweet{}, "Replies"),
cmpopts.IgnoreFields(twitterscraper.Tweet{}, "Retweets"), cmpopts.IgnoreFields(twitterscraper.Tweet{}, "Retweets"),
cmpopts.IgnoreFields(twitterscraper.Tweet{}, "Views"),
cmpopts.IgnoreFields(twitterscraper.Tweet{}, "IsSelfThread"),
cmpopts.IgnoreFields(twitterscraper.Tweet{}, "Thread"),
cmpopts.IgnoreFields(twitterscraper.Tweet{}, "TimeParsed"),
} }
func TestGetTweets(t *testing.T) { func TestGetTweets(t *testing.T) {
count := 0 count := 0
maxTweetsNbr := 300 maxTweetsNbr := 100
dupcheck := make(map[string]bool) dupcheck := make(map[string]bool)
scraper := twitterscraper.New() for tweet := range testScraper.GetTweets(context.Background(), "x", maxTweetsNbr) {
_, err := scraper.LoginOpenAccount()
if err != nil {
t.Fatalf("LoginOpenAccount() error = %v", err)
}
for tweet := range scraper.GetTweets(context.Background(), "Twitter", maxTweetsNbr) {
if tweet.Error != nil { if tweet.Error != nil {
t.Error(tweet.Error) t.Error(tweet.Error)
} else { } else {
@ -76,6 +75,7 @@ func TestGetTweets(t *testing.T) {
} }
func assertGetTweet(t *testing.T, expectedTweet *twitterscraper.Tweet) { func assertGetTweet(t *testing.T, expectedTweet *twitterscraper.Tweet) {
// to get tweet as struct fmt.Printf("%#v", actualTweet)
actualTweet, err := testScraper.GetTweet(expectedTweet.ID) actualTweet, err := testScraper.GetTweet(expectedTweet.ID)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
@ -86,42 +86,48 @@ func assertGetTweet(t *testing.T, expectedTweet *twitterscraper.Tweet) {
func TestGetTweetWithVideo(t *testing.T) { func TestGetTweetWithVideo(t *testing.T) {
expectedTweet := twitterscraper.Tweet{ expectedTweet := twitterscraper.Tweet{
ConversationID: "1328684389388185600", ConversationID: "1697304622749086011",
HTML: "That thing you didnt Tweet but wanted to but didnt but got so close but then were like nah. <br><br>We have a place for that now—Fleets! <br><br>Rolling out to everyone starting today. <br><a href=\"https://t.co/auQAHXZMfH\"><img src=\"https://pbs.twimg.com/amplify_video_thumb/1328684333599756289/img/cP5KwbIXbGunNSBy.jpg\"/></a>", HTML: "on iOS &amp; Android, you can now swipe to reply when you slide into their DMs <br><a href=\"https://t.co/evuWpMfBxQ\"><img src=\"https://pbs.twimg.com/amplify_video_thumb/1697304568550330368/img/BUlESpef6FmWV_j2.jpg\"/></a>",
ID: "1328684389388185600", ID: "1697304622749086011",
Name: "Twitter", Name: "X",
PermanentURL: "https://twitter.com/Twitter/status/1328684389388185600", PermanentURL: "https://twitter.com/X/status/1697304622749086011",
Photos: nil, Photos: nil,
Text: "That thing you didnt Tweet but wanted to but didnt but got so close but then were like nah. \n\nWe have a place for that now—Fleets! \n\nRolling out to everyone starting today. https://t.co/auQAHXZMfH", Text: "on iOS &amp; Android, you can now swipe to reply when you slide into their DMs https://t.co/evuWpMfBxQ",
TimeParsed: time.Date(2020, 11, 17, 13, 0, 18, 0, time.FixedZone("UTC", 0)), Timestamp: 1693503931,
Timestamp: 1605618018,
UserID: "783214", UserID: "783214",
Username: "Twitter", Username: "X",
Videos: []twitterscraper.Video{{ Videos: []twitterscraper.Video{
ID: "1328684333599756289", {
Preview: "https://pbs.twimg.com/amplify_video_thumb/1328684333599756289/img/cP5KwbIXbGunNSBy.jpg", ID: "1697304568550330368",
URL: "https://video.twimg.com/amplify_video/1328684333599756289/vid/960x720/PcL8yv8KhgQ48Qpt.mp4?tag=13", Preview: "https://pbs.twimg.com/amplify_video_thumb/1697304568550330368/img/BUlESpef6FmWV_j2.jpg",
}}, URL: "https://video.twimg.com/amplify_video/1697304568550330368/vid/720x720/KyQlZA9zaf0kqY9Z.mp4?tag=14",
},
},
} }
assertGetTweet(t, &expectedTweet) assertGetTweet(t, &expectedTweet)
} }
func TestGetTweetWithMultiplePhotos(t *testing.T) { func TestGetTweetWithMultiplePhotos(t *testing.T) {
expectedTweet := twitterscraper.Tweet{ expectedTweet := twitterscraper.Tweet{
ConversationID: "1390026628957417473", ConversationID: "1577677328968204291",
HTML: `no bird too tall, no crop too short<br><br>introducing bigger and better images on iOS and Android, now available to everyone <br><a href="https://t.co/2buHfhfRAx"><img src="https://pbs.twimg.com/media/E0pd2L2XEAQ_gnn.jpg"/></a><br><img src="https://pbs.twimg.com/media/E0pd2hPXoAY9-TZ.jpg"/>`, HTML: "More ways to discover videos on Twitter are here!<br><br>Now on iOS, videos on your timeline will open in our full screen immersive video player, where you can swipe up to keep discovering more content. <br><a href=\"https://t.co/XI2vM8DKXA\"><img src=\"https://pbs.twimg.com/media/FeUJKdnXEAEFe2j.jpg\"/></a><br><img src=\"https://pbs.twimg.com/media/FeUJKuxXEAAa6t7.jpg\"/>",
ID: "1390026628957417473", ID: "1577677328968204291",
Name: "Twitter", Name: "Support",
PermanentURL: "https://twitter.com/Twitter/status/1390026628957417473", PermanentURL: "https://twitter.com/Support/status/1577677328968204291",
Photos: []twitterscraper.Photo{ Photos: []twitterscraper.Photo{
{ID: "1390026620472332292", URL: "https://pbs.twimg.com/media/E0pd2L2XEAQ_gnn.jpg"}, {
{ID: "1390026626214371334", URL: "https://pbs.twimg.com/media/E0pd2hPXoAY9-TZ.jpg"}, ID: "1577677319816286209",
URL: "https://pbs.twimg.com/media/FeUJKdnXEAEFe2j.jpg",
}, },
Text: "no bird too tall, no crop too short\n\nintroducing bigger and better images on iOS and Android, now available to everyone https://t.co/2buHfhfRAx", {
TimeParsed: time.Date(2021, 5, 5, 19, 32, 28, 0, time.FixedZone("UTC", 0)), ID: "1577677324421632000",
Timestamp: 1620243148, URL: "https://pbs.twimg.com/media/FeUJKuxXEAAa6t7.jpg",
UserID: "783214", },
Username: "Twitter", },
Text: "More ways to discover videos on Twitter are here!\n\nNow on iOS, videos on your timeline will open in our full screen immersive video player, where you can swipe up to keep discovering more content. https://t.co/XI2vM8DKXA",
Timestamp: 1664982561,
UserID: "17874544",
Username: "Support",
} }
assertGetTweet(t, &expectedTweet) assertGetTweet(t, &expectedTweet)
} }
@ -131,24 +137,22 @@ func TestGetTweetWithGIF(t *testing.T) {
t.Skip("Skipping test due to environment variable") t.Skip("Skipping test due to environment variable")
} }
expectedTweet := twitterscraper.Tweet{ expectedTweet := twitterscraper.Tweet{
ConversationID: "1288540609310056450", ConversationID: "1517535384833605632",
GIFs: []twitterscraper.GIF{ GIFs: []twitterscraper.GIF{
{ {
ID: "1288540582768517123", ID: "1517535349890813952",
Preview: "https://pbs.twimg.com/tweet_video_thumb/EeHQ1UKXoAMVxWB.jpg", Preview: "https://pbs.twimg.com/tweet_video_thumb/FQ9eXEhXEAA-haj.jpg",
URL: "https://video.twimg.com/tweet_video/EeHQ1UKXoAMVxWB.mp4", URL: "https://video.twimg.com/tweet_video/FQ9eXEhXEAA-haj.mp4",
}, },
}, },
Hashtags: []string{"CountdownToMars"}, HTML: "Video captions or no captions, its now easier to choose for some of you on iOS, and soon on Android.<br><br>On videos that have captions available, were testing the option to turn captions off/on with a new “CC” button. <br><a href=\"https://t.co/Q2Q2Wmr78U\"><img src=\"https://pbs.twimg.com/tweet_video_thumb/FQ9eXEhXEAA-haj.jpg\"/></a>",
HTML: `Like for liftoff! <a href="https://twitter.com/hashtag/CountdownToMars">#CountdownToMars</a> <br><a href="https://t.co/yLe331pHfY"><img src="https://pbs.twimg.com/tweet_video_thumb/EeHQ1UKXoAMVxWB.jpg"/></a>`, ID: "1517535384833605632",
ID: "1288540609310056450", Name: "Support",
Name: "Twitter", PermanentURL: "https://twitter.com/Support/status/1517535384833605632",
PermanentURL: "https://twitter.com/Twitter/status/1288540609310056450", Text: "Video captions or no captions, its now easier to choose for some of you on iOS, and soon on Android.\n\nOn videos that have captions available, were testing the option to turn captions off/on with a new “CC” button. https://t.co/Q2Q2Wmr78U",
Text: "Like for liftoff! #CountdownToMars https://t.co/yLe331pHfY", Timestamp: 1650643604,
TimeParsed: time.Date(2020, 7, 29, 18, 23, 15, 0, time.FixedZone("UTC", 0)), UserID: "17874544",
Timestamp: 1596046995, Username: "Support",
UserID: "783214",
Username: "Twitter",
} }
assertGetTweet(t, &expectedTweet) assertGetTweet(t, &expectedTweet)
} }
@ -158,24 +162,23 @@ func TestGetTweetWithPhotoAndGIF(t *testing.T) {
t.Skip("Skipping test due to environment variable") t.Skip("Skipping test due to environment variable")
} }
expectedTweet := twitterscraper.Tweet{ expectedTweet := twitterscraper.Tweet{
ConversationID: "1580661436132757506", ConversationID: "1583186305722507265",
GIFs: []twitterscraper.GIF{ GIFs: []twitterscraper.GIF{
{ {
ID: "1580661428335382531", ID: "1583186295588790290",
Preview: "https://pbs.twimg.com/tweet_video_thumb/Fe-jMcIXkAMXK_W.jpg", Preview: "https://pbs.twimg.com/tweet_video_thumb/FfibjDnWIBIt5fn.jpg",
URL: "https://video.twimg.com/tweet_video/Fe-jMcIXkAMXK_W.mp4", URL: "https://video.twimg.com/tweet_video/FfibjDnWIBIt5fn.mp4",
}, },
}, },
HTML: `a hit Tweet <br><a href="https://t.co/2C7cah4KzW"><img src="https://pbs.twimg.com/media/Fe-jMcGWQAAFWoG.jpg"/></a><br><img src="https://pbs.twimg.com/tweet_video_thumb/Fe-jMcIXkAMXK_W.jpg"/>`, HTML: "“we need to talk” <br><br>irl vs on Spaces <br><a href=\"https://t.co/hrflPpbpif\"><img src=\"https://pbs.twimg.com/tweet_video_thumb/FfibjDnWIBIt5fn.jpg\"/></a><br><img src=\"https://pbs.twimg.com/media/FfibjDwWIAwvbtJ.jpg\"/>",
ID: "1580661436132757506", ID: "1583186305722507265",
Name: "Twitter", Name: "Spaces",
PermanentURL: "https://twitter.com/Twitter/status/1580661436132757506", PermanentURL: "https://twitter.com/XSpaces/status/1583186305722507265",
Photos: []twitterscraper.Photo{{ID: "1580661428326907904", URL: "https://pbs.twimg.com/media/Fe-jMcGWQAAFWoG.jpg"}}, Photos: []twitterscraper.Photo{{ID: "1583186295626539020", URL: "https://pbs.twimg.com/media/FfibjDwWIAwvbtJ.jpg"}},
Text: "a hit Tweet https://t.co/2C7cah4KzW", Text: "“we need to talk” \n\nirl vs on Spaces https://t.co/hrflPpbpif",
TimeParsed: time.Date(2022, 10, 13, 20, 47, 8, 0, time.FixedZone("UTC", 0)), Timestamp: 1666296004,
Timestamp: 1665694028, UserID: "1065249714214457345",
UserID: "783214", Username: "XSpaces",
Username: "Twitter",
} }
assertGetTweet(t, &expectedTweet) assertGetTweet(t, &expectedTweet)
} }
@ -211,7 +214,6 @@ func TestQuotedAndReply(t *testing.T) {
Replies: 12, Replies: 12,
Retweets: 18, Retweets: 18,
Text: "The Easiest Problem Everyone Gets Wrong \n\n[new video] --&gt; https://t.co/YdaeDYmPAU https://t.co/iKu4Xs6o2V", Text: "The Easiest Problem Everyone Gets Wrong \n\n[new video] --&gt; https://t.co/YdaeDYmPAU https://t.co/iKu4Xs6o2V",
TimeParsed: time.Date(2020, 0o3, 9, 20, 18, 33, 0, time.FixedZone("UTC", 0)),
Timestamp: 1583785113, Timestamp: 1583785113,
URLs: []string{"https://youtu.be/ytfCdqWhmdg"}, URLs: []string{"https://youtu.be/ytfCdqWhmdg"},
UserID: "978944851", UserID: "978944851",
@ -243,22 +245,19 @@ func TestQuotedAndReply(t *testing.T) {
} }
func TestRetweet(t *testing.T) { func TestRetweet(t *testing.T) {
sample := &twitterscraper.Tweet{ sample := &twitterscraper.Tweet{
ConversationID: "1359151057872580612", ConversationID: "1758837061786779942",
HTML: "Weve seen an increase in attacks against Asian communities and individuals around the world. Its important to know that this isnt new; throughout history, Asians have experienced violence and exclusion. However, their diverse lived experiences have largely been overlooked.", HTML: "no ads, just bangers<br><br>aka your For You feed with Premium+<br><br>subscribe here → <a href=\"https://x.com/i/premium_sign_up\">https://t.co/APTO1t7kMk</a>",
ID: "1359151057872580612", ID: "1758837061786779942",
URLs: []string{"https://x.com/i/premium_sign_up"},
IsSelfThread: false, IsSelfThread: false,
Likes: 6683, Name: "Premium",
Name: "Twitter Together", PermanentURL: "https://twitter.com/premium/status/1758837061786779942",
PermanentURL: "https://twitter.com/TwitterTogether/status/1359151057872580612", Text: "no ads, just bangers\n\naka your For You feed with Premium+\n\nsubscribe here → https://t.co/APTO1t7kMk",
Replies: 456, Timestamp: 1708174407,
Retweets: 1495, UserID: "1399766153053061121",
Text: "Weve seen an increase in attacks against Asian communities and individuals around the world. Its important to know that this isnt new; throughout history, Asians have experienced violence and exclusion. However, their diverse lived experiences have largely been overlooked.", Username: "premium",
TimeParsed: time.Date(2021, 02, 9, 14, 43, 58, 0, time.FixedZone("UTC", 0)),
Timestamp: 1612881838,
UserID: "773578328498372608",
Username: "TwitterTogether",
} }
tweet, err := testScraper.GetTweet("1362849141248974853") tweet, err := testScraper.GetTweet("1758837226379596068")
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} else { } else {
@ -276,15 +275,14 @@ func TestTweetViews(t *testing.T) {
HTML: "Replies and likes dont tell the whole story. Were making it easier to tell *just* how many people have seen your Tweets with the addition of view counts, shown right next to likes. Now on iOS and Android, web coming soon.", HTML: "Replies and likes dont tell the whole story. Were making it easier to tell *just* how many people have seen your Tweets with the addition of view counts, shown right next to likes. Now on iOS and Android, web coming soon.",
ID: "1606055187348688896", ID: "1606055187348688896",
Likes: 2839, Likes: 2839,
Name: "Twitter Support", Name: "Support",
PermanentURL: "https://twitter.com/TwitterSupport/status/1606055187348688896", PermanentURL: "https://twitter.com/Support/status/1606055187348688896",
Replies: 3427, Replies: 3427,
Retweets: 783, Retweets: 783,
Text: "Replies and likes dont tell the whole story. Were making it easier to tell *just* how many people have seen your Tweets with the addition of view counts, shown right next to likes. Now on iOS and Android, web coming soon.", Text: "Replies and likes dont tell the whole story. Were making it easier to tell *just* how many people have seen your Tweets with the addition of view counts, shown right next to likes. Now on iOS and Android, web coming soon.",
TimeParsed: time.Date(2022, 12, 22, 22, 32, 50, 0, time.FixedZone("UTC", 0)),
Timestamp: 1612881838, Timestamp: 1612881838,
UserID: "17874544", UserID: "17874544",
Username: "TwitterSupport", Username: "Support",
Views: 3189278, Views: 3189278,
} }
tweet, err := testScraper.GetTweet("1606055187348688896") tweet, err := testScraper.GetTweet("1606055187348688896")