@memberjunction/server-bootstrap 6.1.0-edge.1 → 6.1.0-edge.3

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.
@@ -1,185 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- vi.mock('@memberjunction/server', () => ({
3
- serve: vi.fn().mockResolvedValue(undefined),
4
- MJServerOptions: class {
5
- },
6
- configInfo: {},
7
- }));
8
- vi.mock('cosmiconfig', () => ({
9
- cosmiconfigSync: vi.fn().mockReturnValue({
10
- search: vi.fn().mockReturnValue({
11
- config: {
12
- codeGeneration: {
13
- packages: {
14
- entities: { name: '@test/generated-entities' },
15
- actions: { name: '@test/generated-actions' },
16
- },
17
- },
18
- },
19
- filepath: '/test/mj.config.cjs',
20
- isEmpty: false,
21
- }),
22
- }),
23
- }));
24
- // Fake installed Open App server packages. Each exports RESOLVER_PATHS (the convention the
25
- // app-server CodeGen emits: "absolute paths to the generated resolver files, for use with
26
- // createMJServer()") plus a `load` startup export.
27
- const ENABLED_APP_RESOLVER = '/abs/node_modules/@test/openapp-server/dist/generated/generated.js';
28
- const DISABLED_APP_RESOLVER = '/abs/node_modules/@test/disabled-server/dist/generated/generated.js';
29
- vi.mock('@test/openapp-server', () => ({ RESOLVER_PATHS: [ENABLED_APP_RESOLVER], load: vi.fn() }));
30
- vi.mock('@test/disabled-server', () => ({ RESOLVER_PATHS: [DISABLED_APP_RESOLVER], load: vi.fn() }));
31
- import { createMJServer } from '../index.js';
32
- import { serve } from '@memberjunction/server';
33
- import { cosmiconfigSync } from 'cosmiconfig';
34
- describe('ServerBootstrap', () => {
35
- beforeEach(() => {
36
- vi.clearAllMocks();
37
- });
38
- describe('createMJServer', () => {
39
- it('should be a function', () => {
40
- expect(typeof createMJServer).toBe('function');
41
- });
42
- it('should call cosmiconfigSync with mj module name', async () => {
43
- await createMJServer();
44
- expect(cosmiconfigSync).toHaveBeenCalledWith('mj', expect.objectContaining({
45
- searchStrategy: 'global',
46
- }));
47
- });
48
- it('should call serve with default resolver paths when none provided', async () => {
49
- await createMJServer();
50
- expect(serve).toHaveBeenCalledWith(expect.arrayContaining([
51
- expect.stringContaining('generated.{js,ts}'),
52
- ]), undefined, expect.objectContaining({}));
53
- });
54
- it('should call serve with custom resolver paths when provided', async () => {
55
- const customPaths = ['./custom/**/*Resolver.ts'];
56
- await createMJServer({ resolverPaths: customPaths });
57
- expect(serve).toHaveBeenCalledWith(customPaths, undefined, expect.objectContaining({}));
58
- });
59
- it('should call beforeStart hook if provided', async () => {
60
- const beforeStart = vi.fn();
61
- await createMJServer({ beforeStart });
62
- expect(beforeStart).toHaveBeenCalled();
63
- });
64
- it('should call afterStart hook if provided', async () => {
65
- const afterStart = vi.fn();
66
- await createMJServer({ afterStart });
67
- expect(afterStart).toHaveBeenCalled();
68
- });
69
- it('should pass restApiOptions to serve', async () => {
70
- const restApiOptions = { enabled: true };
71
- await createMJServer({ restApiOptions });
72
- expect(serve).toHaveBeenCalledWith(expect.anything(), undefined, expect.objectContaining({ restApiOptions }));
73
- });
74
- it('should use custom configPath when provided', async () => {
75
- const mockSearch = vi.fn().mockReturnValue({
76
- config: {},
77
- filepath: '/custom/path/mj.config.cjs',
78
- isEmpty: false,
79
- });
80
- cosmiconfigSync.mockReturnValue({ search: mockSearch });
81
- await createMJServer({ configPath: '/custom/path' });
82
- expect(mockSearch).toHaveBeenCalledWith('/custom/path');
83
- });
84
- it('tolerates a missing Open App server package and still boots (never crashes)', async () => {
85
- const mockSearch = vi.fn().mockReturnValue({
86
- config: {
87
- dynamicPackages: {
88
- server: [
89
- { PackageName: '@nonexistent/openapp-server', StartupExport: 'load', Enabled: true },
90
- ],
91
- },
92
- },
93
- filepath: '/test/mj.config.cjs',
94
- isEmpty: false,
95
- });
96
- cosmiconfigSync.mockReturnValue({ search: mockSearch });
97
- // import() of a non-existent package throws ERR_MODULE_NOT_FOUND; the loader
98
- // must swallow it so boot proceeds (serve still called).
99
- await expect(createMJServer()).resolves.toBeUndefined();
100
- expect(serve).toHaveBeenCalled();
101
- });
102
- it('skips disabled Open App server packages', async () => {
103
- const mockSearch = vi.fn().mockReturnValue({
104
- config: {
105
- dynamicPackages: {
106
- server: [{ PackageName: '@nonexistent/disabled-server', Enabled: false }],
107
- },
108
- },
109
- filepath: '/test/mj.config.cjs',
110
- isEmpty: false,
111
- });
112
- cosmiconfigSync.mockReturnValue({ search: mockSearch });
113
- await expect(createMJServer()).resolves.toBeUndefined();
114
- expect(serve).toHaveBeenCalled();
115
- });
116
- it("passes an enabled app's RESOLVER_PATHS to serve() so its GraphQL ops enter the schema", async () => {
117
- const mockSearch = vi.fn().mockReturnValue({
118
- config: {
119
- dynamicPackages: {
120
- server: [{ PackageName: '@test/openapp-server', StartupExport: 'load', Enabled: true }],
121
- },
122
- },
123
- filepath: '/test/mj.config.cjs',
124
- isEmpty: false,
125
- });
126
- cosmiconfigSync.mockReturnValue({ search: mockSearch });
127
- await createMJServer();
128
- // The app package's resolver file must be in serve()'s glob set — otherwise its
129
- // mutations/queries register type-graphql metadata but never enter the schema.
130
- const servePaths = serve.mock.calls[0][0];
131
- expect(servePaths).toContain(ENABLED_APP_RESOLVER);
132
- // The standard base globs are still present.
133
- expect(servePaths.some((p) => p.includes('generated.{js,ts}'))).toBe(true);
134
- });
135
- it("does NOT pass a disabled app's RESOLVER_PATHS to serve()", async () => {
136
- const mockSearch = vi.fn().mockReturnValue({
137
- config: {
138
- dynamicPackages: {
139
- server: [{ PackageName: '@test/disabled-server', StartupExport: 'load', Enabled: false }],
140
- },
141
- },
142
- filepath: '/test/mj.config.cjs',
143
- isEmpty: false,
144
- });
145
- cosmiconfigSync.mockReturnValue({ search: mockSearch });
146
- await createMJServer();
147
- const servePaths = serve.mock.calls[0][0];
148
- expect(servePaths).not.toContain(DISABLED_APP_RESOLVER);
149
- });
150
- it('passes only the base resolver globs to serve() when no apps are installed', async () => {
151
- // Explicit no-dynamicPackages config → serve() gets exactly the base globs, no extras.
152
- const mockSearch = vi.fn().mockReturnValue({
153
- config: {},
154
- filepath: '/test/mj.config.cjs',
155
- isEmpty: false,
156
- });
157
- cosmiconfigSync.mockReturnValue({ search: mockSearch });
158
- await createMJServer();
159
- const servePaths = serve.mock.calls[0][0];
160
- expect(servePaths.length).toBeGreaterThan(0);
161
- expect(servePaths.every((p) => p.includes('generated.{js,ts}'))).toBe(true);
162
- });
163
- });
164
- describe('MJServerConfig interface', () => {
165
- it('should accept empty config object', async () => {
166
- const config = {};
167
- expect(config).toBeDefined();
168
- expect(config.configPath).toBeUndefined();
169
- expect(config.resolverPaths).toBeUndefined();
170
- expect(config.beforeStart).toBeUndefined();
171
- expect(config.afterStart).toBeUndefined();
172
- });
173
- it('should accept all optional properties', () => {
174
- const config = {
175
- configPath: '/test/config',
176
- resolverPaths: ['./resolvers/**/*.ts'],
177
- beforeStart: async () => { },
178
- afterStart: async () => { },
179
- };
180
- expect(config.configPath).toBe('/test/config');
181
- expect(config.resolverPaths).toHaveLength(1);
182
- });
183
- });
184
- });
185
- //# sourceMappingURL=server-bootstrap.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-bootstrap.test.js","sourceRoot":"","sources":["../../src/__tests__/server-bootstrap.test.ts"],"names":[],"mappings":"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"}