@devvit/test 0.12.6-next-2025-12-11-00-01-42-4d43dd38d.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devvit/test",
3
- "version": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
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",
@@ -35,15 +35,16 @@
35
35
  "test:unit-with-coverage": "vitest run --coverage"
36
36
  },
37
37
  "dependencies": {
38
- "@devvit/media": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
39
- "@devvit/protos": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
40
- "@devvit/realtime": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
41
- "@devvit/reddit": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
42
- "@devvit/redis": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
43
- "@devvit/scheduler": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
44
- "@devvit/server": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
45
- "@devvit/settings": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
46
- "@devvit/shared-types": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
38
+ "@devvit/media": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
39
+ "@devvit/notifications": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
40
+ "@devvit/protos": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
41
+ "@devvit/realtime": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
42
+ "@devvit/reddit": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
43
+ "@devvit/redis": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
44
+ "@devvit/scheduler": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
45
+ "@devvit/server": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
46
+ "@devvit/settings": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
47
+ "@devvit/shared-types": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
47
48
  "ioredis": "5.7.0",
48
49
  "redis-memory-server": "0.12.1"
49
50
  },
@@ -51,11 +52,11 @@
51
52
  "vitest": "*"
52
53
  },
53
54
  "devDependencies": {
54
- "@devvit/repo-tools": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
55
- "@devvit/tsconfig": "0.12.6-next-2025-12-11-00-01-42-4d43dd38d.0",
55
+ "@devvit/repo-tools": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
56
+ "@devvit/tsconfig": "0.12.6-next-2025-12-11-18-30-05-ab21270e1.0",
56
57
  "eslint": "9.11.1",
57
58
  "typescript": "5.8.3",
58
59
  "vitest": "1.6.1"
59
60
  },
60
- "gitHead": "54eef0d373b14d9fab0ea151b82e026269cd19aa"
61
+ "gitHead": "b5df4e08e30b06913b446adb0177d7eb00253139"
61
62
  }
@@ -1,11 +1,16 @@
1
1
  import { type HTTP, type Metadata } from '@devvit/protos';
2
2
  import type { FetchRequest, FetchResponse } from '@devvit/protos/types/devvit/plugin/http/http.js';
3
+ import type { PluginMock } from '@devvit/shared-types/test/index.js';
4
+ export declare class HTTPPluginMock implements HTTP {
5
+ Fetch(_request: FetchRequest, _metadata?: Metadata): Promise<FetchResponse>;
6
+ }
3
7
  /**
4
8
  * Mock implementation of the HTTP plugin that throws an error when requests are made.
5
9
  *
6
10
  * Use this in tests to ensure that HTTP requests are not accidentally made.
7
11
  */
8
- export declare class HTTPMock implements HTTP {
9
- Fetch(_request: FetchRequest, _metadata?: Metadata): Promise<FetchResponse>;
12
+ export declare class HTTPMock implements PluginMock<HTTP> {
13
+ readonly plugin: HTTPPluginMock;
14
+ constructor();
10
15
  }
11
16
  //# sourceMappingURL=httpMock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"httpMock.d.ts","sourceRoot":"","sources":["../../../../src/server/mocks/http/httpMock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAEnG;;;;GAIG;AACH,qBAAa,QAAS,YAAW,IAAI;IAC7B,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;CAKlF"}
1
+ {"version":3,"file":"httpMock.d.ts","sourceRoot":"","sources":["../../../../src/server/mocks/http/httpMock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iDAAiD,CAAC;AACnG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAErE,qBAAa,cAAe,YAAW,IAAI;IACnC,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;CAKlF;AAED;;;;GAIG;AACH,qBAAa,QAAS,YAAW,UAAU,CAAC,IAAI,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;;CAKjC"}
@@ -1,11 +1,16 @@
1
1
  import {} from '@devvit/protos';
2
+ export class HTTPPluginMock {
3
+ async Fetch(_request, _metadata) {
4
+ throw new Error(`HTTP requests are not allowed in tests by default. To mock HTTP requests, use vi.spyOn(globalThis, "fetch"). See https://developers.reddit.com/docs/guides/tools/devvit_test#http for details.`);
5
+ }
6
+ }
2
7
  /**
3
8
  * Mock implementation of the HTTP plugin that throws an error when requests are made.
4
9
  *
5
10
  * Use this in tests to ensure that HTTP requests are not accidentally made.
6
11
  */
7
12
  export class HTTPMock {
8
- async Fetch(_request, _metadata) {
9
- throw new Error(`HTTP requests are not allowed in tests by default. To mock HTTP requests, use vi.spyOn(globalThis, "fetch"). See https://developers.reddit.com/docs/guides/tools/devvit_test#http for details.`);
13
+ constructor() {
14
+ this.plugin = new HTTPPluginMock();
10
15
  }
11
16
  }
@@ -1,5 +1,6 @@
1
1
  import '@devvit/shared-types/polyfill/fetch.polyfill.js';
2
2
  import { MediaMock } from '@devvit/media/test';
3
+ import { NotificationsMock } from '@devvit/notifications/test';
3
4
  import { RealtimeMock } from '@devvit/realtime/server/test';
4
5
  import { RedditPluginMock } from '@devvit/reddit/test';
5
6
  import { RedisMock } from '@devvit/redis/test';
@@ -61,6 +62,7 @@ export type DevvitFixtures = {
61
62
  realtime: RealtimeMock;
62
63
  settings: SettingsMock;
63
64
  scheduler: SchedulerMock;
65
+ notifications: NotificationsMock;
64
66
  };
65
67
  };
66
68
  export type DevvitTestConfig = {
@@ -1 +1 @@
1
- {"version":3,"file":"devvitTest.d.ts","sourceRoot":"","sources":["../../../src/server/vitest/devvitTest.ts"],"names":[],"mappings":"AAAA,OAAO,iDAAiD,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAO/C,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gDAAgD,CAAC;AAMhF,OAAO,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,QAAQ,CAAC;AAGpD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAKrD,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,OAAO,EAAE;SAAG,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,MAAM;KAAE,CAAC;IAEtC;;;OAGG;IACH,QAAQ,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;KAAE,CAAC;IAE9E;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,MAAM,EAAE,EAAE,CAAC;IAEX;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,WAAW,EAAE,EAAE,CAAC;IAEhB;;;OAGG;IACH,KAAK,EAAE;QACL,KAAK,EAAE,SAAS,CAAC;QACjB,KAAK,EAAE,SAAS,CAAC;QACjB,IAAI,EAAE,QAAQ,CAAC;QACf,MAAM,EAAE,gBAAgB,CAAC;QACzB,QAAQ,EAAE,YAAY,CAAC;QACvB,QAAQ,EAAE,YAAY,CAAC;QACvB,SAAS,EAAE,aAAa,CAAC;KAC1B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,EAAE,CAAC;IAEZ;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,WAAW,CAAC,EAAE,EAAE,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;KAAE,CAAC;IAE/E;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AA0JF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAQ,gBAAqB,KAAG,OAAO,CAAC,cAAc,CAEtF,CAAC"}
1
+ {"version":3,"file":"devvitTest.d.ts","sourceRoot":"","sources":["../../../src/server/vitest/devvitTest.ts"],"names":[],"mappings":"AAAA,OAAO,iDAAiD,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAQ/D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gDAAgD,CAAC;AAMhF,OAAO,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AAG1D,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,QAAQ,CAAC;AAGpD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAUrD,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,OAAO,EAAE;SAAG,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,MAAM;KAAE,CAAC;IAEtC;;;OAGG;IACH,QAAQ,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;KAAE,CAAC;IAE9E;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,MAAM,EAAE,EAAE,CAAC;IAEX;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,WAAW,EAAE,EAAE,CAAC;IAEhB;;;OAGG;IACH,KAAK,EAAE;QACL,KAAK,EAAE,SAAS,CAAC;QACjB,KAAK,EAAE,SAAS,CAAC;QACjB,IAAI,EAAE,QAAQ,CAAC;QACf,MAAM,EAAE,gBAAgB,CAAC;QACzB,QAAQ,EAAE,YAAY,CAAC;QACvB,QAAQ,EAAE,YAAY,CAAC;QACvB,SAAS,EAAE,aAAa,CAAC;QACzB,aAAa,EAAE,iBAAiB,CAAC;KAClC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,EAAE,CAAC;IAEZ;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,WAAW,CAAC,EAAE,EAAE,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;KAAE,CAAC;IAE/E;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAiKF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAQ,gBAAqB,KAAG,OAAO,CAAC,cAAc,CAEtF,CAAC"}
@@ -1,9 +1,11 @@
1
1
  import '@devvit/shared-types/polyfill/fetch.polyfill.js';
2
2
  import { MediaMock } from '@devvit/media/test';
3
+ import { NotificationsMock } from '@devvit/notifications/test';
3
4
  import { SchedulerDefinition } from '@devvit/protos';
4
5
  import { RealtimeDefinition } from '@devvit/protos/types/devvit/events/v1alpha/realtime.js';
5
6
  import { HTTPDefinition } from '@devvit/protos/types/devvit/plugin/http/http.js';
6
7
  import { MediaServiceDefinition } from '@devvit/protos/types/devvit/plugin/media/media.js';
8
+ import { NotificationsDefinition } from '@devvit/protos/types/devvit/plugin/notifications/notifications_svc.js';
7
9
  import { RedisAPIDefinition } from '@devvit/protos/types/devvit/plugin/redis/redisapi.js';
8
10
  import { SettingsDefinition } from '@devvit/protos/types/devvit/plugin/settings/v1alpha/settings.js';
9
11
  import { RealtimeMock } from '@devvit/realtime/server/test';
@@ -14,10 +16,16 @@ import { Context, runWithContext } from '@devvit/server';
14
16
  import { SettingsMock } from '@devvit/settings/test';
15
17
  import { Header } from '@devvit/shared-types/Header.js';
16
18
  import { getDefaultAppConfig, makeConfig, MOCK_HEADERS as headersMock, } from '@devvit/shared-types/test/index.js';
19
+ import { Redis } from 'ioredis';
20
+ import { RedisMemoryServer } from 'redis-memory-server';
17
21
  import { test as baseTest, vi } from 'vitest';
18
22
  import { HTTPMock } from '../mocks/http/httpMock.js';
19
23
  import { installDevvitInterceptors, runWithTestContext } from './context.js';
20
24
  installDevvitInterceptors();
25
+ const redisServer = new RedisMemoryServer();
26
+ const host = await redisServer.getHost();
27
+ const port = await redisServer.getPort();
28
+ const sharedRedisConn = new Redis({ host, port });
21
29
  function createWrappedTestApi(target, setup) {
22
30
  return new Proxy(target, {
23
31
  // Handles: test(...), test.only(...), test.skip(...),
@@ -94,23 +102,29 @@ const setup = (config) => {
94
102
  [Header.SubredditName]: subredditName,
95
103
  };
96
104
  const mediaMock = new MediaMock();
97
- const redisMock = new RedisMock();
105
+ const redisMock = new RedisMock(sharedRedisConn);
98
106
  const httpMock = new HTTPMock();
99
107
  const redditMock = new RedditPluginMock();
100
108
  const realtimeMock = new RealtimeMock();
101
109
  const settingsMock = new SettingsMock(settings);
102
110
  const schedulerMock = new SchedulerMock();
111
+ const notificationsMock = new NotificationsMock();
103
112
  // Seed default context data so helpers like getCurrentUser/subreddit work.
104
- redditMock.addUser({ id: userId, name: username });
105
- redditMock.addSubreddit({ id: subredditId, displayName: subredditName, title: subredditName });
113
+ redditMock.users.addUser({ id: userId, name: username });
114
+ redditMock.subreddits.addSubreddit({
115
+ id: subredditId,
116
+ displayName: subredditName,
117
+ title: subredditName,
118
+ });
106
119
  const cfg = makeConfig({
107
120
  plugins: {
108
- [MediaServiceDefinition.fullName]: mediaMock,
109
- [RedisAPIDefinition.fullName]: redisMock,
110
- [HTTPDefinition.fullName]: httpMock,
121
+ [MediaServiceDefinition.fullName]: mediaMock.plugin,
122
+ [RedisAPIDefinition.fullName]: redisMock.plugin,
123
+ [HTTPDefinition.fullName]: httpMock.plugin,
111
124
  [RealtimeDefinition.fullName]: realtimeMock.plugin,
112
125
  [SettingsDefinition.fullName]: settingsMock.plugin,
113
126
  [SchedulerDefinition.fullName]: schedulerMock.plugin,
127
+ [NotificationsDefinition.fullName]: notificationsMock.plugin,
114
128
  ...redditMock.getPluginRegistrations(),
115
129
  },
116
130
  });
@@ -132,6 +146,7 @@ const setup = (config) => {
132
146
  realtime: realtimeMock,
133
147
  settings: settingsMock,
134
148
  scheduler: schedulerMock,
149
+ notifications: notificationsMock,
135
150
  },
136
151
  };
137
152
  return { reqCtx, fixtures, testContext: { config: cfg, appConfig: contextAppConfig } };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devvitTest.notifications.test.d.ts","sourceRoot":"","sources":["../../../src/server/vitest/devvitTest.notifications.test.ts"],"names":[],"mappings":""}