@devvit/reddit 0.12.6-next-2025-12-11-16-58-10-b6fe687e3.0 → 0.12.6-next-2025-12-11-18-30-05-ab21270e1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/mocks/GraphQLMock.d.ts +6 -1
- package/mocks/GraphQLMock.d.ts.map +1 -1
- package/mocks/GraphQLMock.js +6 -1
- package/mocks/LinksAndCommentsMock.d.ts +21 -3
- package/mocks/LinksAndCommentsMock.d.ts.map +1 -1
- package/mocks/LinksAndCommentsMock.js +28 -13
- package/mocks/RedditPluginMock.d.ts +4 -33
- package/mocks/RedditPluginMock.d.ts.map +1 -1
- package/mocks/RedditPluginMock.js +4 -27
- package/mocks/SubredditMock.d.ts +18 -2
- package/mocks/SubredditMock.d.ts.map +1 -1
- package/mocks/SubredditMock.js +17 -5
- package/mocks/UserMock.d.ts +18 -2
- package/mocks/UserMock.d.ts.map +1 -1
- package/mocks/UserMock.js +18 -6
- package/package.json +10 -10
package/mocks/GraphQLMock.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import type { GraphQL, Metadata, QueryResponse } from '@devvit/protos';
|
|
2
2
|
import type { PersistedQueryRequest, QueryRequest } from '@devvit/protos/types/devvit/plugin/redditapi/graphql/graphql_msg.js';
|
|
3
|
+
import type { PluginMock } from '@devvit/shared-types/test/index.js';
|
|
3
4
|
import type { LinksAndCommentsMock } from './LinksAndCommentsMock.js';
|
|
4
|
-
export declare class
|
|
5
|
+
export declare class GraphQLPluginMock implements GraphQL {
|
|
5
6
|
private readonly _linksAndCommentsMock;
|
|
6
7
|
constructor(linksAndCommentsMock: LinksAndCommentsMock);
|
|
7
8
|
PersistedQuery(request: PersistedQueryRequest, _metadata?: Metadata): Promise<QueryResponse>;
|
|
8
9
|
Query(_request: QueryRequest, _metadata?: Metadata): Promise<QueryResponse>;
|
|
9
10
|
}
|
|
11
|
+
export declare class GraphQLMock implements PluginMock<GraphQL> {
|
|
12
|
+
readonly plugin: GraphQLPluginMock;
|
|
13
|
+
constructor(linksAndCommentsMock: LinksAndCommentsMock);
|
|
14
|
+
}
|
|
10
15
|
//# sourceMappingURL=GraphQLMock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphQLMock.d.ts","sourceRoot":"","sources":["../../src/mocks/GraphQLMock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACb,MAAM,qEAAqE,CAAC;
|
|
1
|
+
{"version":3,"file":"GraphQLMock.d.ts","sourceRoot":"","sources":["../../src/mocks/GraphQLMock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACb,MAAM,qEAAqE,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAErE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAatE,qBAAa,iBAAkB,YAAW,OAAO;IAC/C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAuB;gBAEjD,oBAAoB,EAAE,oBAAoB;IAIhD,cAAc,CAClB,OAAO,EAAE,qBAAqB,EAC9B,SAAS,CAAC,EAAE,QAAQ,GACnB,OAAO,CAAC,aAAa,CAAC;IA+BnB,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;CAMlF;AAED,qBAAa,WAAY,YAAW,UAAU,CAAC,OAAO,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;gBAEvB,oBAAoB,EAAE,oBAAoB;CAGvD"}
|
package/mocks/GraphQLMock.js
CHANGED
|
@@ -8,7 +8,7 @@ const methodMap = {
|
|
|
8
8
|
GetSubredditInfoById: 'getSubredditInfoById',
|
|
9
9
|
CreateShareUrl: 'createShareUrl',
|
|
10
10
|
};
|
|
11
|
-
export class
|
|
11
|
+
export class GraphQLPluginMock {
|
|
12
12
|
constructor(linksAndCommentsMock) {
|
|
13
13
|
this._linksAndCommentsMock = linksAndCommentsMock;
|
|
14
14
|
}
|
|
@@ -41,3 +41,8 @@ export class GraphQLMock {
|
|
|
41
41
|
`For more information, visit https://developers.reddit.com/docs/guides/tools/devvit_test`);
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
+
export class GraphQLMock {
|
|
45
|
+
constructor(linksAndCommentsMock) {
|
|
46
|
+
this.plugin = new GraphQLPluginMock(linksAndCommentsMock);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -2,9 +2,14 @@ import type { Empty, LinksAndComments, Metadata } from '@devvit/protos';
|
|
|
2
2
|
import { type JsonRedditObjects, type JsonStatus, type Listing, RedditObject } from '@devvit/protos/types/devvit/plugin/redditapi/common/common_msg.js';
|
|
3
3
|
import type { BasicIdRequest, CommentRequest, EditCustomPostRequest, FollowPostRequest, InfoRequest, JsonWrappedComment, MoreChildrenRequest, ReportAwardRequest, ReportRequest, SaveRequest, SendRepliesRequest, SetContestModeRequest, SetCustomPostPreviewRequest, SetSubredditStickyRequest, SetSuggestedSortRequest, SubmitRequest, SubmitResponse, VoteRequest } from '@devvit/protos/types/devvit/plugin/redditapi/linksandcomments/linksandcomments_msg.js';
|
|
4
4
|
import { type JsonObject, T3 } from '@devvit/shared';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import type { PluginMock } from '@devvit/shared-types/test/index.js';
|
|
6
|
+
type LinksAndCommentsStore = {
|
|
7
|
+
posts: Map<string, RedditObject>;
|
|
8
|
+
postData: Map<string, Readonly<JsonObject>>;
|
|
9
|
+
};
|
|
10
|
+
export declare class LinksAndCommentsPluginMock implements LinksAndComments {
|
|
11
|
+
private readonly _store;
|
|
12
|
+
constructor(store: LinksAndCommentsStore);
|
|
8
13
|
Comment(_request: CommentRequest, _metadata?: Metadata): Promise<JsonWrappedComment>;
|
|
9
14
|
Del(request: BasicIdRequest, _metadata?: Metadata): Promise<Empty>;
|
|
10
15
|
EditCustomPost(request: EditCustomPostRequest, _metadata?: Metadata): Promise<JsonRedditObjects>;
|
|
@@ -32,10 +37,23 @@ export declare class LinksAndCommentsMock implements LinksAndComments {
|
|
|
32
37
|
Unsave(_request: BasicIdRequest, _metadata?: Metadata): Promise<Empty>;
|
|
33
38
|
Unspoiler(_request: BasicIdRequest, _metadata?: Metadata): Promise<Empty>;
|
|
34
39
|
Vote(_request: VoteRequest, _metadata?: Metadata): Promise<Empty>;
|
|
40
|
+
}
|
|
41
|
+
export declare class LinksAndCommentsMock implements PluginMock<LinksAndComments> {
|
|
42
|
+
readonly plugin: LinksAndCommentsPluginMock;
|
|
43
|
+
private readonly _store;
|
|
44
|
+
constructor();
|
|
45
|
+
/**
|
|
46
|
+
* Retrieves developer data associated with a post.
|
|
47
|
+
*/
|
|
35
48
|
getPostData(postId: string): JsonObject | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Seeds the mock database with a Post.
|
|
51
|
+
* This allows tests to set up state before calling `reddit.getPostById`.
|
|
52
|
+
*/
|
|
36
53
|
addPost(post: Omit<Partial<RedditObject>, 'id'> & {
|
|
37
54
|
id: T3;
|
|
38
55
|
title: string;
|
|
39
56
|
}): RedditObject;
|
|
40
57
|
}
|
|
58
|
+
export {};
|
|
41
59
|
//# sourceMappingURL=LinksAndCommentsMock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinksAndCommentsMock.d.ts","sourceRoot":"","sources":["../../src/mocks/LinksAndCommentsMock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,YAAY,EACb,MAAM,mEAAmE,CAAC;AAC3E,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,qBAAqB,EACrB,2BAA2B,EAC3B,yBAAyB,EACzB,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,WAAW,EACZ,MAAM,uFAAuF,CAAC;AAE/F,OAAO,EAAE,KAAK,UAAU,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"LinksAndCommentsMock.d.ts","sourceRoot":"","sources":["../../src/mocks/LinksAndCommentsMock.ts"],"names":[],"mappings":"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"}
|
|
@@ -194,27 +194,26 @@ const DEFAULT_COMMENT = {
|
|
|
194
194
|
function fakeId() {
|
|
195
195
|
return `t3_${Math.random().toString(36).substring(7)}`;
|
|
196
196
|
}
|
|
197
|
-
export class
|
|
198
|
-
constructor() {
|
|
199
|
-
this.
|
|
200
|
-
this._postData = new Map();
|
|
197
|
+
export class LinksAndCommentsPluginMock {
|
|
198
|
+
constructor(store) {
|
|
199
|
+
this._store = store;
|
|
201
200
|
}
|
|
202
201
|
async Comment(_request, _metadata) {
|
|
203
202
|
throw new Error(`Reddit API method Users.Friend is not implemented in the test harness.\n` +
|
|
204
203
|
`For more information, visit https://developers.reddit.com/docs/guides/tools/devvit_test`);
|
|
205
204
|
}
|
|
206
205
|
async Del(request, _metadata) {
|
|
207
|
-
this.
|
|
206
|
+
this._store.posts.delete(request.id);
|
|
208
207
|
return {};
|
|
209
208
|
}
|
|
210
209
|
async EditCustomPost(request, _metadata) {
|
|
211
210
|
if (request.postData?.developerData) {
|
|
212
|
-
this.
|
|
211
|
+
this._store.postData.set(request.thingId, request.postData.developerData);
|
|
213
212
|
}
|
|
214
213
|
return { json: { errors: [], data: { things: [] } } };
|
|
215
214
|
}
|
|
216
215
|
async EditUserText(request, _metadata) {
|
|
217
|
-
const post = this.
|
|
216
|
+
const post = this._store.posts.get(request.thingId);
|
|
218
217
|
if (!post) {
|
|
219
218
|
throw new Error('Post not found');
|
|
220
219
|
}
|
|
@@ -254,7 +253,7 @@ export class LinksAndCommentsMock {
|
|
|
254
253
|
async Info(request, _metadata) {
|
|
255
254
|
const children = [];
|
|
256
255
|
for (const id of request.thingIds) {
|
|
257
|
-
const post = this.
|
|
256
|
+
const post = this._store.posts.get(id);
|
|
258
257
|
if (post) {
|
|
259
258
|
children.push({
|
|
260
259
|
kind: 't3',
|
|
@@ -334,7 +333,7 @@ export class LinksAndCommentsMock {
|
|
|
334
333
|
selftext: request.text,
|
|
335
334
|
authorFullname: 't2_testuser',
|
|
336
335
|
};
|
|
337
|
-
this.
|
|
336
|
+
this._store.posts.set(id, post);
|
|
338
337
|
return {
|
|
339
338
|
json: {
|
|
340
339
|
data: {
|
|
@@ -363,9 +362,9 @@ export class LinksAndCommentsMock {
|
|
|
363
362
|
selftext: '',
|
|
364
363
|
authorFullname: 't2_testuser',
|
|
365
364
|
};
|
|
366
|
-
this.
|
|
365
|
+
this._store.posts.set(id, post);
|
|
367
366
|
if (request.postData?.developerData) {
|
|
368
|
-
this.
|
|
367
|
+
this._store.postData.set(id, request.postData.developerData);
|
|
369
368
|
}
|
|
370
369
|
return {
|
|
371
370
|
json: {
|
|
@@ -402,9 +401,25 @@ export class LinksAndCommentsMock {
|
|
|
402
401
|
throw new Error(`Reddit API method LinksAndComments.Vote is not implemented in the test harness.\n` +
|
|
403
402
|
`For more information, visit https://developers.reddit.com/docs/guides/tools/devvit_test`);
|
|
404
403
|
}
|
|
404
|
+
}
|
|
405
|
+
export class LinksAndCommentsMock {
|
|
406
|
+
constructor() {
|
|
407
|
+
this._store = {
|
|
408
|
+
posts: new Map(),
|
|
409
|
+
postData: new Map(),
|
|
410
|
+
};
|
|
411
|
+
this.plugin = new LinksAndCommentsPluginMock(this._store);
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Retrieves developer data associated with a post.
|
|
415
|
+
*/
|
|
405
416
|
getPostData(postId) {
|
|
406
|
-
return this.
|
|
417
|
+
return this._store.postData.get(postId);
|
|
407
418
|
}
|
|
419
|
+
/**
|
|
420
|
+
* Seeds the mock database with a Post.
|
|
421
|
+
* This allows tests to set up state before calling `reddit.getPostById`.
|
|
422
|
+
*/
|
|
408
423
|
addPost(post) {
|
|
409
424
|
const fullId = post.id;
|
|
410
425
|
const shortId = fullId.replace(/^t3_/, '');
|
|
@@ -422,7 +437,7 @@ export class LinksAndCommentsMock {
|
|
|
422
437
|
id: shortId,
|
|
423
438
|
name: post.title,
|
|
424
439
|
};
|
|
425
|
-
this.
|
|
440
|
+
this._store.posts.set(fullId, newPost);
|
|
426
441
|
return newPost;
|
|
427
442
|
}
|
|
428
443
|
}
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
import type { RedditObject } from '@devvit/protos/types/devvit/plugin/redditapi/common/common_msg.js';
|
|
2
|
-
import type { SubredditAboutResponse_AboutData } from '@devvit/protos/types/devvit/plugin/redditapi/subreddits/subreddits_msg.js';
|
|
3
|
-
import type { User } from '@devvit/protos/types/devvit/reddit/user.js';
|
|
4
|
-
import { T3, type T5 } from '@devvit/shared';
|
|
5
|
-
import { T2 } from '@devvit/shared-types/tid.js';
|
|
6
1
|
import { GraphQLMock } from './GraphQLMock.js';
|
|
7
2
|
import { LinksAndCommentsMock } from './LinksAndCommentsMock.js';
|
|
8
3
|
import { SubredditMock } from './SubredditMock.js';
|
|
@@ -42,42 +37,18 @@ export declare class RedditPluginMock {
|
|
|
42
37
|
*/
|
|
43
38
|
getPluginRegistrations(): {
|
|
44
39
|
"devvit.plugin.redditapi.flair.Flair": unknown;
|
|
45
|
-
"devvit.plugin.redditapi.graphql.GraphQL": GraphQLMock;
|
|
46
|
-
"devvit.plugin.redditapi.linksandcomments.LinksAndComments": LinksAndCommentsMock;
|
|
40
|
+
"devvit.plugin.redditapi.graphql.GraphQL": import("./GraphQLMock.js").GraphQLPluginMock;
|
|
41
|
+
"devvit.plugin.redditapi.linksandcomments.LinksAndComments": import("./LinksAndCommentsMock.js").LinksAndCommentsPluginMock;
|
|
47
42
|
"devvit.plugin.redditapi.listings.Listings": unknown;
|
|
48
43
|
"devvit.plugin.redditapi.moderation.Moderation": unknown;
|
|
49
44
|
"devvit.plugin.redditapi.modnote.ModNote": unknown;
|
|
50
45
|
"devvit.plugin.redditapi.newmodmail.NewModmail": unknown;
|
|
51
46
|
"devvit.plugin.redditapi.privatemessages.PrivateMessages": unknown;
|
|
52
|
-
"devvit.plugin.redditapi.subreddits.Subreddits": SubredditMock;
|
|
53
|
-
"devvit.plugin.redditapi.users.Users": UserMock;
|
|
47
|
+
"devvit.plugin.redditapi.subreddits.Subreddits": import("./SubredditMock.js").SubredditPluginMock;
|
|
48
|
+
"devvit.plugin.redditapi.users.Users": import("./UserMock.js").UserPluginMock;
|
|
54
49
|
"devvit.plugin.redditapi.widgets.Widgets": unknown;
|
|
55
50
|
"devvit.plugin.redditapi.wiki.Wiki": unknown;
|
|
56
51
|
};
|
|
57
|
-
/**
|
|
58
|
-
* Helper to seed the mock database with a User.
|
|
59
|
-
* This allows tests to set up state before calling `reddit.getUserByUsername`.
|
|
60
|
-
*/
|
|
61
|
-
addUser(user: Omit<Partial<User>, 'id'> & {
|
|
62
|
-
name: string;
|
|
63
|
-
id: T2;
|
|
64
|
-
}): User;
|
|
65
|
-
/**
|
|
66
|
-
* Helper to seed the mock database with a Post.
|
|
67
|
-
* This allows tests to set up state before calling `reddit.getPostById`.
|
|
68
|
-
*/
|
|
69
|
-
addPost(post: Omit<Partial<RedditObject>, 'id'> & {
|
|
70
|
-
id: T3;
|
|
71
|
-
title: string;
|
|
72
|
-
}): RedditObject;
|
|
73
|
-
/**
|
|
74
|
-
* Helper to seed the mock database with a Subreddit.
|
|
75
|
-
* This allows tests to set up state before calling `reddit.getSubredditByName`.
|
|
76
|
-
*/
|
|
77
|
-
addSubreddit(data: Partial<SubredditAboutResponse_AboutData> & {
|
|
78
|
-
id: T5;
|
|
79
|
-
displayName: string;
|
|
80
|
-
}): SubredditAboutResponse_AboutData;
|
|
81
52
|
private _createUnimplementedPluginService;
|
|
82
53
|
}
|
|
83
54
|
//# sourceMappingURL=RedditPluginMock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedditPluginMock.d.ts","sourceRoot":"","sources":["../../src/mocks/RedditPluginMock.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RedditPluginMock.d.ts","sourceRoot":"","sources":["../../src/mocks/RedditPluginMock.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;;;;;;;;;;;;GAcG;AACH,qBAAa,gBAAgB;IAE3B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,oBAAoB,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;;IAwCvB;;;OAGG;IACH,sBAAsB;;;;;;;;;;;;;;IAiBtB,OAAO,CAAC,iCAAiC;CAa1C"}
|
|
@@ -10,8 +10,6 @@ import { SubredditsDefinition } from '@devvit/protos/types/devvit/plugin/reddita
|
|
|
10
10
|
import { UsersDefinition } from '@devvit/protos/types/devvit/plugin/redditapi/users/users_svc.js';
|
|
11
11
|
import { WidgetsDefinition } from '@devvit/protos/types/devvit/plugin/redditapi/widgets/widgets_svc.js';
|
|
12
12
|
import { WikiDefinition } from '@devvit/protos/types/devvit/plugin/redditapi/wiki/wiki_svc.js';
|
|
13
|
-
import { T3 } from '@devvit/shared';
|
|
14
|
-
import { T2 } from '@devvit/shared-types/tid.js';
|
|
15
13
|
import { GraphQLMock } from './GraphQLMock.js';
|
|
16
14
|
import { LinksAndCommentsMock } from './LinksAndCommentsMock.js';
|
|
17
15
|
import { SubredditMock } from './SubredditMock.js';
|
|
@@ -69,40 +67,19 @@ export class RedditPluginMock {
|
|
|
69
67
|
getPluginRegistrations() {
|
|
70
68
|
return {
|
|
71
69
|
[FlairDefinition.fullName]: this.flair,
|
|
72
|
-
[GraphQLDefinition.fullName]: this.graphQL,
|
|
73
|
-
[LinksAndCommentsDefinition.fullName]: this.linksAndComments,
|
|
70
|
+
[GraphQLDefinition.fullName]: this.graphQL.plugin,
|
|
71
|
+
[LinksAndCommentsDefinition.fullName]: this.linksAndComments.plugin,
|
|
74
72
|
[ListingsDefinition.fullName]: this.listings,
|
|
75
73
|
[ModerationDefinition.fullName]: this.moderation,
|
|
76
74
|
[ModNoteDefinition.fullName]: this.modNote,
|
|
77
75
|
[NewModmailDefinition.fullName]: this.newModmail,
|
|
78
76
|
[PrivateMessagesDefinition.fullName]: this.privateMessages,
|
|
79
|
-
[SubredditsDefinition.fullName]: this.subreddits,
|
|
80
|
-
[UsersDefinition.fullName]: this.users,
|
|
77
|
+
[SubredditsDefinition.fullName]: this.subreddits.plugin,
|
|
78
|
+
[UsersDefinition.fullName]: this.users.plugin,
|
|
81
79
|
[WidgetsDefinition.fullName]: this.widgets,
|
|
82
80
|
[WikiDefinition.fullName]: this.wiki,
|
|
83
81
|
};
|
|
84
82
|
}
|
|
85
|
-
/**
|
|
86
|
-
* Helper to seed the mock database with a User.
|
|
87
|
-
* This allows tests to set up state before calling `reddit.getUserByUsername`.
|
|
88
|
-
*/
|
|
89
|
-
addUser(user) {
|
|
90
|
-
return this.users.addUser(user);
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Helper to seed the mock database with a Post.
|
|
94
|
-
* This allows tests to set up state before calling `reddit.getPostById`.
|
|
95
|
-
*/
|
|
96
|
-
addPost(post) {
|
|
97
|
-
return this.linksAndComments.addPost(post);
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Helper to seed the mock database with a Subreddit.
|
|
101
|
-
* This allows tests to set up state before calling `reddit.getSubredditByName`.
|
|
102
|
-
*/
|
|
103
|
-
addSubreddit(data) {
|
|
104
|
-
return this.subreddits.addSubreddit(data);
|
|
105
|
-
}
|
|
106
83
|
_createUnimplementedPluginService(pluginName) {
|
|
107
84
|
return new Proxy({}, {
|
|
108
85
|
get: () => () => {
|
package/mocks/SubredditMock.d.ts
CHANGED
|
@@ -2,8 +2,14 @@ import type { JsonStatus, Listing, Metadata, Subreddits } from '@devvit/protos';
|
|
|
2
2
|
import type { Empty, StringValue } from '@devvit/protos/community.js';
|
|
3
3
|
import type { AboutWhereRequest, BasicSearchRequest, BasicSubredditRequest, BasicWhereRequest, DeleteSrImgRequest, SearchRedditNamesResponse, SearchSubredditsResponse, SiteAdminRequest, StickyRequest, StickyResponse, SubmitTextResponse, SubredditAboutEditRequest, SubredditAboutEditResponse, SubredditAboutResponse, SubredditAboutResponse_AboutData, SubredditAboutRulesResponse, SubredditAboutTrafficResponse, SubredditAddRemovalReasonRequest, SubredditAddRemovalReasonResponse, SubredditAutocompleteRequest, SubredditAutocompleteResponse, SubredditGetRemovalReasonsRequest, SubredditGetRemovalReasonsResponse, SubredditPostRequirementsResponse, SubredditsSearchRequest, SubredditsSearchResponse, SubredditStylesheetRequest, SubscribeRequest, UploadSrImgRequest, UploadSrImgResponse, UserSearchResponse, UsersSearchRequest } from '@devvit/protos/types/devvit/plugin/redditapi/subreddits/subreddits_msg.js';
|
|
4
4
|
import type { T5 } from '@devvit/shared';
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
import type { PluginMock } from '@devvit/shared-types/test/index.js';
|
|
6
|
+
type SubredditDisplayName = string;
|
|
7
|
+
type SubredditStore = {
|
|
8
|
+
subreddits: Map<SubredditDisplayName, SubredditAboutResponse_AboutData>;
|
|
9
|
+
};
|
|
10
|
+
export declare class SubredditPluginMock implements Subreddits {
|
|
11
|
+
private readonly _store;
|
|
12
|
+
constructor(store: SubredditStore);
|
|
7
13
|
AboutWhere(_request: AboutWhereRequest, _metadata?: Metadata): Promise<Listing>;
|
|
8
14
|
DeleteSrBanner(_request: BasicSubredditRequest, _metadata?: Metadata): Promise<JsonStatus>;
|
|
9
15
|
DeleteSrHeader(_request: BasicSubredditRequest, _metadata?: Metadata): Promise<JsonStatus>;
|
|
@@ -31,9 +37,19 @@ export declare class SubredditMock implements Subreddits {
|
|
|
31
37
|
UploadSrImg(_request: UploadSrImgRequest, _metadata?: Metadata): Promise<UploadSrImgResponse>;
|
|
32
38
|
UsersSearch(_request: UsersSearchRequest, _metadata?: Metadata): Promise<UserSearchResponse>;
|
|
33
39
|
UsersWhere(_request: BasicWhereRequest, _metadata?: Metadata): Promise<SubredditsSearchResponse>;
|
|
40
|
+
}
|
|
41
|
+
export declare class SubredditMock implements PluginMock<Subreddits> {
|
|
42
|
+
readonly plugin: SubredditPluginMock;
|
|
43
|
+
private readonly _store;
|
|
44
|
+
constructor();
|
|
45
|
+
/**
|
|
46
|
+
* Helper to seed the mock database with a Subreddit.
|
|
47
|
+
* This allows tests to set up state before calling `reddit.getSubredditByName`.
|
|
48
|
+
*/
|
|
34
49
|
addSubreddit(data: Partial<SubredditAboutResponse_AboutData> & {
|
|
35
50
|
id: T5;
|
|
36
51
|
displayName: string;
|
|
37
52
|
}): SubredditAboutResponse_AboutData;
|
|
38
53
|
}
|
|
54
|
+
export {};
|
|
39
55
|
//# sourceMappingURL=SubredditMock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubredditMock.d.ts","sourceRoot":"","sources":["../../src/mocks/SubredditMock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,wBAAwB,EACxB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,gCAAgC,EAChC,2BAA2B,EAC3B,6BAA6B,EAC7B,gCAAgC,EAChC,iCAAiC,EACjC,4BAA4B,EAC5B,6BAA6B,EAC7B,iCAAiC,EACjC,kCAAkC,EAClC,iCAAiC,EACjC,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,EAC1B,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,2EAA2E,CAAC;AACnF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"SubredditMock.d.ts","sourceRoot":"","sources":["../../src/mocks/SubredditMock.ts"],"names":[],"mappings":"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"}
|
package/mocks/SubredditMock.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export class
|
|
2
|
-
constructor() {
|
|
3
|
-
this.
|
|
1
|
+
export class SubredditPluginMock {
|
|
2
|
+
constructor(store) {
|
|
3
|
+
this._store = store;
|
|
4
4
|
}
|
|
5
5
|
async AboutWhere(_request, _metadata) {
|
|
6
6
|
throw new Error(`Reddit API method Subreddits.AboutWhere is not implemented in the test harness.\n` +
|
|
@@ -49,7 +49,7 @@ export class SubredditMock {
|
|
|
49
49
|
async SubredditAbout(request, _metadata) {
|
|
50
50
|
const subredditName = request.subreddit;
|
|
51
51
|
let found;
|
|
52
|
-
for (const [name, data] of this.
|
|
52
|
+
for (const [name, data] of this._store.subreddits.entries()) {
|
|
53
53
|
if (name.toLowerCase() === subredditName.toLowerCase()) {
|
|
54
54
|
found = data;
|
|
55
55
|
break;
|
|
@@ -120,6 +120,18 @@ export class SubredditMock {
|
|
|
120
120
|
throw new Error(`Reddit API method Subreddits.UsersWhere is not implemented in the test harness.\n` +
|
|
121
121
|
`For more information, visit https://developers.reddit.com/docs/guides/tools/devvit_test`);
|
|
122
122
|
}
|
|
123
|
+
}
|
|
124
|
+
export class SubredditMock {
|
|
125
|
+
constructor() {
|
|
126
|
+
this._store = {
|
|
127
|
+
subreddits: new Map(),
|
|
128
|
+
};
|
|
129
|
+
this.plugin = new SubredditPluginMock(this._store);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Helper to seed the mock database with a Subreddit.
|
|
133
|
+
* This allows tests to set up state before calling `reddit.getSubredditByName`.
|
|
134
|
+
*/
|
|
123
135
|
addSubreddit(data) {
|
|
124
136
|
const subreddit = {
|
|
125
137
|
createdUtc: Math.floor(Date.now() / 1000),
|
|
@@ -134,7 +146,7 @@ export class SubredditMock {
|
|
|
134
146
|
...data,
|
|
135
147
|
id: data.id.replace(/^t5_/, ''),
|
|
136
148
|
};
|
|
137
|
-
this.
|
|
149
|
+
this._store.subreddits.set(data.displayName, subreddit);
|
|
138
150
|
return subreddit;
|
|
139
151
|
}
|
|
140
152
|
}
|
package/mocks/UserMock.d.ts
CHANGED
|
@@ -2,9 +2,15 @@ import type { Empty, JsonStatus, Listing, Metadata, Users } from '@devvit/protos
|
|
|
2
2
|
import type { BoolValue } from '@devvit/protos/community.js';
|
|
3
3
|
import type { BlockUserRequest, BlockUserResponse, FriendRequest, GeneralFriendResponse, GenericUsersRequest, GetUserKarmaForSubredditRequest, GetUserKarmaForSubredditResponse, ReportUserRequest, SetPermissionsRequest, UnfriendRequest, UpdateFriendRelationshipRequest, UserAboutRequest, UserAboutResponse, UserDataByAccountIdsRequest, UserDataByAccountIdsResponse, UsernameAvailableRequest, UserTrophiesResponse, UserWhereRequest } from '@devvit/protos/types/devvit/plugin/redditapi/users/users_msg.js';
|
|
4
4
|
import type { User } from '@devvit/protos/types/devvit/reddit/user.js';
|
|
5
|
+
import type { PluginMock } from '@devvit/shared-types/test/index.js';
|
|
5
6
|
import { T2 } from '@devvit/shared-types/tid.js';
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
type Username = string;
|
|
8
|
+
type UserStore = {
|
|
9
|
+
users: Map<Username, User>;
|
|
10
|
+
};
|
|
11
|
+
export declare class UserPluginMock implements Users {
|
|
12
|
+
private readonly _store;
|
|
13
|
+
constructor(store: UserStore);
|
|
8
14
|
UserAbout(request: UserAboutRequest, _metadata?: Metadata): Promise<UserAboutResponse>;
|
|
9
15
|
UserDataByAccountIds(request: UserDataByAccountIdsRequest, _metadata?: Metadata): Promise<UserDataByAccountIdsResponse>;
|
|
10
16
|
BlockUser(_request: BlockUserRequest, _metadata?: Metadata): Promise<BlockUserResponse>;
|
|
@@ -19,9 +25,19 @@ export declare class UserMock implements Users {
|
|
|
19
25
|
UserTrophies(_request: GenericUsersRequest, _metadata?: Metadata): Promise<UserTrophiesResponse>;
|
|
20
26
|
UserWhere(_request: UserWhereRequest, _metadata?: Metadata): Promise<Listing>;
|
|
21
27
|
UsernameAvailable(_request: UsernameAvailableRequest, _metadata?: Metadata): Promise<BoolValue>;
|
|
28
|
+
}
|
|
29
|
+
export declare class UserMock implements PluginMock<Users> {
|
|
30
|
+
readonly plugin: UserPluginMock;
|
|
31
|
+
private readonly _store;
|
|
32
|
+
constructor();
|
|
33
|
+
/**
|
|
34
|
+
* Seeds the mock database with a User.
|
|
35
|
+
* This allows tests to set up state before calling `reddit.getUserByUsername`.
|
|
36
|
+
*/
|
|
22
37
|
addUser(data: Omit<Partial<User>, 'id'> & {
|
|
23
38
|
name: string;
|
|
24
39
|
id: T2;
|
|
25
40
|
}): User;
|
|
26
41
|
}
|
|
42
|
+
export {};
|
|
27
43
|
//# sourceMappingURL=UserMock.d.ts.map
|
package/mocks/UserMock.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserMock.d.ts","sourceRoot":"","sources":["../../src/mocks/UserMock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,+BAA+B,EAC/B,gCAAgC,EAChC,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,+BAA+B,EAC/B,gBAAgB,EAChB,iBAAiB,EACjB,2BAA2B,EAC3B,4BAA4B,EAE5B,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,iEAAiE,CAAC;AACzE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4CAA4C,CAAC;AACvE,OAAO,EAAQ,EAAE,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"UserMock.d.ts","sourceRoot":"","sources":["../../src/mocks/UserMock.ts"],"names":[],"mappings":"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"}
|
package/mocks/UserMock.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { isT2, T2 } from '@devvit/shared-types/tid.js';
|
|
2
|
-
export class
|
|
3
|
-
constructor() {
|
|
4
|
-
this.
|
|
2
|
+
export class UserPluginMock {
|
|
3
|
+
constructor(store) {
|
|
4
|
+
this._store = store;
|
|
5
5
|
}
|
|
6
6
|
async UserAbout(request, _metadata) {
|
|
7
|
-
const user = this.
|
|
7
|
+
const user = this._store.users.get(request.username);
|
|
8
8
|
if (!user) {
|
|
9
9
|
// Simulate 404
|
|
10
10
|
throw new Error('HTTP 404 Not Found');
|
|
@@ -16,7 +16,7 @@ export class UserMock {
|
|
|
16
16
|
const responseUsers = {};
|
|
17
17
|
for (const id of ids) {
|
|
18
18
|
const targetId = T2(isT2(id) ? id : `t2_${id}`);
|
|
19
|
-
const user = Array.from(this.
|
|
19
|
+
const user = Array.from(this._store.users.values()).find((u) => {
|
|
20
20
|
if (!u.id) {
|
|
21
21
|
return false;
|
|
22
22
|
}
|
|
@@ -84,6 +84,18 @@ export class UserMock {
|
|
|
84
84
|
throw new Error(`Reddit API method Users.UsernameAvailable is not implemented in the test harness.\n` +
|
|
85
85
|
`For more information, visit https://developers.reddit.com/docs/guides/tools/devvit_test`);
|
|
86
86
|
}
|
|
87
|
+
}
|
|
88
|
+
export class UserMock {
|
|
89
|
+
constructor() {
|
|
90
|
+
this._store = {
|
|
91
|
+
users: new Map(),
|
|
92
|
+
};
|
|
93
|
+
this.plugin = new UserPluginMock(this._store);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Seeds the mock database with a User.
|
|
97
|
+
* This allows tests to set up state before calling `reddit.getUserByUsername`.
|
|
98
|
+
*/
|
|
87
99
|
addUser(data) {
|
|
88
100
|
const user = {
|
|
89
101
|
createdUtc: data.createdUtc ?? Math.floor(Date.now() / 1000),
|
|
@@ -107,7 +119,7 @@ export class UserMock {
|
|
|
107
119
|
...data,
|
|
108
120
|
id: data.id.replace(/^t2_/, ''),
|
|
109
121
|
};
|
|
110
|
-
this.
|
|
122
|
+
this._store.users.set(data.name, user);
|
|
111
123
|
return user;
|
|
112
124
|
}
|
|
113
125
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devvit/reddit",
|
|
3
|
-
"version": "0.12.6-next-2025-12-11-
|
|
3
|
+
"version": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
|
|
4
4
|
"license": "BSD-3-Clause",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -32,22 +32,22 @@
|
|
|
32
32
|
"test:unit-with-coverage": "vitest run --coverage"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@devvit/protos": "0.12.6-next-2025-12-11-
|
|
36
|
-
"@devvit/public-api": "0.12.6-next-2025-12-11-
|
|
37
|
-
"@devvit/shared": "0.12.6-next-2025-12-11-
|
|
38
|
-
"@devvit/shared-types": "0.12.6-next-2025-12-11-
|
|
39
|
-
"@devvit/splash": "0.12.6-next-2025-12-11-
|
|
35
|
+
"@devvit/protos": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
|
|
36
|
+
"@devvit/public-api": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
|
|
37
|
+
"@devvit/shared": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
|
|
38
|
+
"@devvit/shared-types": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
|
|
39
|
+
"@devvit/splash": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
42
|
"@devvit/server": "*"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@devvit/repo-tools": "0.12.6-next-2025-12-11-
|
|
46
|
-
"@devvit/server": "0.12.6-next-2025-12-11-
|
|
47
|
-
"@devvit/tsconfig": "0.12.6-next-2025-12-11-
|
|
45
|
+
"@devvit/repo-tools": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
|
|
46
|
+
"@devvit/server": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
|
|
47
|
+
"@devvit/tsconfig": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
|
|
48
48
|
"eslint": "9.11.1",
|
|
49
49
|
"typescript": "5.8.3",
|
|
50
50
|
"vitest": "1.6.1"
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "b5df4e08e30b06913b446adb0177d7eb00253139"
|
|
53
53
|
}
|