Skip to content

Commit 6d96c9f

Browse files
committed
refactor(platforms): fixes bug with tweetDays provider
1 parent 685ff1e commit 6d96c9f

File tree

3 files changed

+93
-42
lines changed

3 files changed

+93
-42
lines changed

platforms/src/Twitter/Providers/__tests__/twitterTweetDays.test.ts

+83-10
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,6 @@ describe("TwittewTweetDaysProvider", function () {
1717

1818
const MOCK_TWITTER_CLIENT = new Client({} as auth.OAuth2User);
1919

20-
const mockContext: ProviderContext = {
21-
twitter: {
22-
id: "123",
23-
},
24-
};
25-
2620
const mockPayload: RequestPayload = {
2721
address: "0x0",
2822
proofs: {
@@ -36,15 +30,80 @@ describe("TwittewTweetDaysProvider", function () {
3630
const sessionKey = mockPayload.proofs.sessionKey;
3731
const code = mockPayload.proofs.code;
3832

39-
it("handles valid tweet days count", async () => {
33+
it("handles gte 30 days tweet count", async () => {
34+
(getUserTweetTimeline as jest.MockedFunction<typeof getUserTweetTimeline>).mockImplementation(() => {
35+
return Promise.resolve({
36+
numberDaysTweeted: 35,
37+
errors: undefined,
38+
});
39+
});
40+
41+
const mockContext: ProviderContext = {
42+
twitter: {
43+
id: "123",
44+
numberDaysTweeted: 35,
45+
errors: undefined,
46+
},
47+
};
48+
49+
const provider = new TwitterTweetDaysProvider({ threshold: "30" });
50+
const result = await provider.verify(mockPayload, mockContext);
51+
52+
expect(getAuthClient).toBeCalledWith(sessionKey, code, mockContext);
53+
expect(getAuthClient).toHaveBeenCalledTimes(1);
54+
expect(getUserTweetTimeline).toHaveBeenCalledTimes(1);
55+
expect(result).toEqual({
56+
valid: true,
57+
error: undefined,
58+
record: { id: "123" },
59+
});
60+
});
61+
62+
it("handles gte 60 days tweet count", async () => {
63+
(getUserTweetTimeline as jest.MockedFunction<typeof getUserTweetTimeline>).mockImplementation(() => {
64+
return Promise.resolve({
65+
numberDaysTweeted: 65,
66+
errors: undefined,
67+
});
68+
});
69+
70+
const mockContext: ProviderContext = {
71+
twitter: {
72+
id: "123",
73+
numberDaysTweeted: 65,
74+
errors: undefined,
75+
},
76+
};
77+
78+
const provider = new TwitterTweetDaysProvider({ threshold: "60" });
79+
const result = await provider.verify(mockPayload, mockContext);
80+
81+
expect(getAuthClient).toBeCalledWith(sessionKey, code, mockContext);
82+
expect(getAuthClient).toHaveBeenCalledTimes(1);
83+
expect(getUserTweetTimeline).toHaveBeenCalledTimes(1);
84+
expect(result).toEqual({
85+
valid: true,
86+
error: undefined,
87+
record: { id: "123" },
88+
});
89+
});
90+
91+
it("handles gte 120 days tweet count", async () => {
4092
(getUserTweetTimeline as jest.MockedFunction<typeof getUserTweetTimeline>).mockImplementation(() => {
4193
return Promise.resolve({
4294
numberDaysTweeted: 120,
43-
valid: true,
4495
errors: undefined,
4596
});
4697
});
4798

99+
const mockContext: ProviderContext = {
100+
twitter: {
101+
id: "123",
102+
numberDaysTweeted: 120,
103+
errors: undefined,
104+
},
105+
};
106+
48107
const provider = new TwitterTweetDaysProvider({ threshold: "120" });
49108
const result = await provider.verify(mockPayload, mockContext);
50109

@@ -62,11 +121,18 @@ describe("TwittewTweetDaysProvider", function () {
62121
(getUserTweetTimeline as jest.MockedFunction<typeof getUserTweetTimeline>).mockImplementation(() => {
63122
return Promise.resolve({
64123
numberDaysTweeted: 12,
65-
valid: false,
66124
errors: undefined,
67125
});
68126
});
69127

128+
const mockContext: ProviderContext = {
129+
twitter: {
130+
id: "123",
131+
numberDaysTweeted: 12,
132+
errors: undefined,
133+
},
134+
};
135+
70136
const provider = new TwitterTweetDaysProvider({ threshold: "120" });
71137
const result = await provider.verify(mockPayload, mockContext);
72138

@@ -84,11 +150,18 @@ describe("TwittewTweetDaysProvider", function () {
84150
(getUserTweetTimeline as jest.MockedFunction<typeof getUserTweetTimeline>).mockImplementation(() => {
85151
return Promise.resolve({
86152
numberDaysTweeted: undefined,
87-
valid: false,
88153
errors: ["Errors"],
89154
});
90155
});
91156

157+
const mockContext: ProviderContext = {
158+
twitter: {
159+
id: "123",
160+
numberDaysTweeted: 35,
161+
errors: undefined,
162+
},
163+
};
164+
92165
const provider = new TwitterTweetDaysProvider({ threshold: "120" });
93166
const result = await provider.verify(mockPayload, mockContext);
94167

platforms/src/Twitter/Providers/twitterTweetDays.ts

+5-10
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@ import { TwitterContext, getAuthClient, getUserTweetTimeline, UserTweetTimeline
66
async function verifyTwitterTweetDays(
77
sessionKey: string,
88
code: string,
9-
context: TwitterContext,
10-
threshold: number
9+
context: TwitterContext
1110
): Promise<UserTweetTimeline> {
1211
const twitterClient = await getAuthClient(sessionKey, code, context);
13-
const data = await getUserTweetTimeline(context, twitterClient, threshold);
12+
const data = await getUserTweetTimeline(context, twitterClient);
1413
return data;
1514
}
1615

@@ -32,15 +31,11 @@ export class TwitterTweetDaysProvider implements Provider {
3231
}
3332

3433
async verify(payload: RequestPayload, context: TwitterContext): Promise<VerifiedPayload> {
35-
const twitterTweetData = await verifyTwitterTweetDays(
36-
payload.proofs.sessionKey,
37-
payload.proofs.code,
38-
context,
39-
parseInt(this._options.threshold)
40-
);
34+
const twitterTweetData = await verifyTwitterTweetDays(payload.proofs.sessionKey, payload.proofs.code, context);
4135

4236
const twitterUserId = context.twitter.id;
43-
const valid = twitterTweetData.valid;
37+
const numberDaysTweeted = context.twitter.numberDaysTweeted;
38+
const valid = numberDaysTweeted >= parseInt(this._options.threshold);
4439

4540
return {
4641
valid,

platforms/src/Twitter/procedures/twitterOauth.ts

+5-22
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ export type TwitterContext = ProviderContext & {
2424
createdAt?: string;
2525
id?: string;
2626
numberDaysTweeted?: number;
27-
valid?: boolean;
2827
};
2928
};
3029

@@ -42,7 +41,6 @@ export type TwitterUserData = {
4241
export type UserTweetTimeline = {
4342
id?: string;
4443
numberDaysTweeted?: number;
45-
valid?: boolean;
4644
errors?: string[];
4745
};
4846

@@ -138,13 +136,12 @@ export const getTwitterUserData = async (context: TwitterContext, twitterClient:
138136

139137
export const getUserTweetTimeline = async (
140138
context: TwitterContext,
141-
twitterClient: Client,
142-
threshold: number
139+
twitterClient: Client
143140
): Promise<UserTweetTimeline> => {
144141
const tweetDays: Set<string> = new Set();
145142
let nextToken: string | undefined;
146143
let apiCallCount = 0;
147-
if (context.twitter.numberDaysTweeted === undefined || context.twitter.valid === false) {
144+
if (context.twitter.numberDaysTweeted === undefined) {
148145
try {
149146
// return information about the (authenticated) requesting user
150147
const userId = (await twitterClient.users.findMyUser()).data.id;
@@ -164,31 +161,18 @@ export const getUserTweetTimeline = async (
164161
tweetDays.add(date);
165162
}
166163
nextToken = userTweetDaysResponse.meta.next_token;
167-
// If user has already tweeted for more than the threshold distinct days, no need to continue
168-
if (tweetDays.size >= threshold) {
169-
context.twitter.id = userId;
170-
context.twitter.numberDaysTweeted = tweetDays.size;
171-
context.twitter.valid = true;
172-
return {
173-
id: userId,
174-
numberDaysTweeted: tweetDays.size,
175-
valid: true,
176-
};
177-
}
164+
165+
context.twitter.id = userId;
166+
context.twitter.numberDaysTweeted = tweetDays.size;
178167
// Respect rate limits by sleeping for a short time after each request
179168
await new Promise((resolve) => setTimeout(resolve, 1000));
180169
} while (nextToken && (apiCallCount <= 14 || tweetDays.size >= 120));
181-
context.twitter.id = userId;
182-
context.twitter.numberDaysTweeted = tweetDays.size;
183-
context.twitter.valid = false;
184170
return {
185171
id: context.twitter.id,
186172
numberDaysTweeted: context.twitter.numberDaysTweeted,
187-
valid: context.twitter.valid,
188173
};
189174
} catch (_error) {
190175
const error = _error as ProviderError;
191-
192176
if (error?.response?.status === 429) {
193177
return {
194178
errors: ["Error getting getting Twitter info", "Rate limit exceeded"],
@@ -202,6 +186,5 @@ export const getUserTweetTimeline = async (
202186
return {
203187
id: context.twitter.id,
204188
numberDaysTweeted: context.twitter.numberDaysTweeted,
205-
valid: context.twitter.valid,
206189
};
207190
};

0 commit comments

Comments
 (0)