Skip to content

Commit b2d9a83

Browse files
feat: custom satellite id in development (#16)
1 parent 1b45eaa commit b2d9a83

File tree

3 files changed

+158
-62
lines changed

3 files changed

+158
-62
lines changed

plugins/plugin-tools/src/config.spec.ts

+61-21
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
satelliteId,
1010
useDockerContainer
1111
} from './config';
12+
import {DOCKER_SATELLITE_ID, ICP_INDEX_ID, ICP_LEDGER_ID, INTERNET_IDENTITY_ID} from './constants';
1213
import {JunoPluginError} from './error';
1314

1415
vi.mock('@junobuild/config-loader', async () => {
@@ -115,31 +116,70 @@ describe('config', () => {
115116
vi.clearAllMocks();
116117
});
117118

118-
it('returns docker satellite ID in dev mode with container true', async () => {
119-
const id = await satelliteId({params: {container: true}, mode: 'development'});
120-
expect(id).toBe('jx5yt-yyaaa-aaaal-abzbq-cai');
121-
});
119+
describe('development', () => {
120+
it('returns docker satellite ID in dev mode with container true and no config file', async () => {
121+
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(false);
122122

123-
it('reads config if not using docker', async () => {
124-
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);
123+
const id = await satelliteId({params: {container: true}, mode: 'development'});
124+
expect(id).toBe(DOCKER_SATELLITE_ID);
125+
});
125126

126-
vi.spyOn(configLoader, 'readJunoConfig').mockResolvedValue({
127-
satellite: {ids: {production: 'prod-sat-id'}}
127+
it('returns satellite ID from config if it exists', async () => {
128+
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);
129+
130+
vi.spyOn(configLoader, 'readJunoConfig').mockResolvedValue({
131+
satellite: {ids: {development: 'dev-custom-id'}}
132+
});
133+
134+
const id = await satelliteId({params: {container: true}, mode: 'development'});
135+
expect(id).toBe('dev-custom-id');
128136
});
129137

130-
const id = await satelliteId({params: {container: false}, mode: 'production'});
131-
expect(id).toBe('prod-sat-id');
138+
it('falls back to default docker satellite ID if config exists but development ID is not set', async () => {
139+
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);
140+
141+
vi.spyOn(configLoader, 'readJunoConfig').mockResolvedValue({
142+
satellite: {ids: {}}
143+
});
144+
145+
const id = await satelliteId({params: {container: true}, mode: 'development'});
146+
expect(id).toBe(DOCKER_SATELLITE_ID);
147+
});
148+
149+
it('falls back to default docker satellite ID if config exists but no ids', async () => {
150+
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);
151+
152+
vi.spyOn(configLoader, 'readJunoConfig').mockResolvedValue({
153+
satellite: {id: 'prod-id'}
154+
});
155+
156+
const id = await satelliteId({params: {container: true}, mode: 'development'});
157+
expect(id).toBe(DOCKER_SATELLITE_ID);
158+
});
132159
});
133160

134-
it('throws if satellite ID is missing', async () => {
135-
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);
136-
vi.spyOn(configLoader, 'readJunoConfig').mockResolvedValue({
137-
satellite: {}
138-
} as unknown as JunoConfig);
161+
describe('no container', () => {
162+
it('reads config if not using docker', async () => {
163+
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);
139164

140-
await expect(() => satelliteId({params: {}, mode: 'production'})).rejects.toThrow(
141-
JunoPluginError
142-
);
165+
vi.spyOn(configLoader, 'readJunoConfig').mockResolvedValue({
166+
satellite: {ids: {production: 'prod-sat-id'}}
167+
});
168+
169+
const id = await satelliteId({params: {container: false}, mode: 'production'});
170+
expect(id).toBe('prod-sat-id');
171+
});
172+
173+
it('throws if satellite ID is missing', async () => {
174+
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);
175+
vi.spyOn(configLoader, 'readJunoConfig').mockResolvedValue({
176+
satellite: {}
177+
} as unknown as JunoConfig);
178+
179+
await expect(() => satelliteId({params: {}, mode: 'production'})).rejects.toThrow(
180+
JunoPluginError
181+
);
182+
});
143183
});
144184
});
145185

@@ -167,9 +207,9 @@ describe('config', () => {
167207
describe('icpIds', () => {
168208
it('returns static ICP IDs', () => {
169209
expect(icpIds()).toEqual({
170-
internetIdentityId: 'rdmx6-jaaaa-aaaaa-aaadq-cai',
171-
icpLedgerId: 'ryjl3-tyaaa-aaaaa-aaaba-cai',
172-
icpIndexId: 'qhbym-qaaaa-aaaaa-aaafq-cai'
210+
internetIdentityId: INTERNET_IDENTITY_ID,
211+
icpLedgerId: ICP_LEDGER_ID,
212+
icpIndexId: ICP_INDEX_ID
173213
});
174214
});
175215
});

plugins/plugin-tools/src/config.ts

+18-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export const useDockerContainer = ({params, mode}: ConfigArgs): boolean =>
2222

2323
export const satelliteId = async (args: ConfigArgs): Promise<string> => {
2424
if (useDockerContainer(args)) {
25-
return DOCKER_SATELLITE_ID;
25+
return await containerSatelliteId(args);
2626
}
2727

2828
return await junoConfigSatelliteId(args);
@@ -46,6 +46,20 @@ const junoConfigSatelliteId = async ({mode}: ConfigArgs): Promise<string> => {
4646
return satelliteId;
4747
};
4848

49+
const containerSatelliteId = async ({mode}: ConfigArgs): Promise<string> => {
50+
const exist = await junoConfigExist();
51+
52+
if (!exist) {
53+
return DOCKER_SATELLITE_ID;
54+
}
55+
56+
const {
57+
satellite: {ids}
58+
} = await readJunoConfig({mode});
59+
60+
return ids?.['development'] ?? DOCKER_SATELLITE_ID;
61+
};
62+
4963
export const orbiterId = async (args: ConfigArgs): Promise<string | undefined> => {
5064
if (useDockerContainer(args)) {
5165
return undefined;
@@ -95,11 +109,13 @@ const readJunoConfig = async ({mode}: ConfigArgs): Promise<JunoConfig> => {
95109
};
96110

97111
export const assertJunoConfig = async () => {
98-
const exist = await junoConfigExistTools(JUNO_CONFIG_FILE);
112+
const exist = await junoConfigExist();
99113

100114
if (!exist) {
101115
throw new JunoPluginError(
102116
`No Juno configuration found. Run "juno init" to configure your dapp.`
103117
);
104118
}
105119
};
120+
121+
const junoConfigExist = (): Promise<boolean> => junoConfigExistTools(JUNO_CONFIG_FILE);

plugins/plugin-tools/src/init.spec.ts

+79-39
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
import type {JunoConfig} from '@junobuild/config';
22
import * as configLoader from '@junobuild/config-loader';
33
import {beforeEach, describe, expect, it, MockInstance, vi} from 'vitest';
4+
import {
5+
DOCKER_CONTAINER_URL,
6+
DOCKER_SATELLITE_ID,
7+
ICP_INDEX_ID,
8+
ICP_LEDGER_ID,
9+
INTERNET_IDENTITY_ID
10+
} from './constants';
411
import {initConfig} from './init';
512
import type {ConfigArgs} from './types';
613

@@ -36,23 +43,25 @@ describe('init', () => {
3643
});
3744

3845
it('returns config for development', async () => {
46+
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(false);
47+
3948
const result = await initConfig({
4049
params: {},
4150
mode: 'development'
4251
});
4352

4453
expect(result).toEqual({
4554
orbiterId: undefined,
46-
satelliteId: 'jx5yt-yyaaa-aaaal-abzbq-cai',
55+
satelliteId: DOCKER_SATELLITE_ID,
4756
icpIds: {
48-
internetIdentityId: 'rdmx6-jaaaa-aaaaa-aaadq-cai',
49-
icpLedgerId: 'ryjl3-tyaaa-aaaaa-aaaba-cai',
50-
icpIndexId: 'qhbym-qaaaa-aaaaa-aaafq-cai'
57+
internetIdentityId: INTERNET_IDENTITY_ID,
58+
icpLedgerId: ICP_LEDGER_ID,
59+
icpIndexId: ICP_INDEX_ID
5160
},
52-
container: 'http://127.0.0.1:5987'
61+
container: DOCKER_CONTAINER_URL
5362
});
5463

55-
expect(spyJunoConfigExist).not.toHaveBeenCalled();
64+
expect(configLoader.junoConfigExist).toHaveBeenCalled();
5665
expect(spyReadJunoConfig).not.toHaveBeenCalled();
5766
});
5867

@@ -63,9 +72,9 @@ describe('init', () => {
6372
satelliteId: 'mock-satellite-id',
6473
orbiterId: 'mock-orbiter-id',
6574
icpIds: {
66-
internetIdentityId: 'rdmx6-jaaaa-aaaaa-aaadq-cai',
67-
icpLedgerId: 'ryjl3-tyaaa-aaaaa-aaaba-cai',
68-
icpIndexId: 'qhbym-qaaaa-aaaaa-aaafq-cai'
75+
internetIdentityId: INTERNET_IDENTITY_ID,
76+
icpLedgerId: ICP_LEDGER_ID,
77+
icpIndexId: ICP_INDEX_ID
6978
},
7079
container: undefined
7180
});
@@ -74,24 +83,52 @@ describe('init', () => {
7483
expect(spyReadJunoConfig).toHaveBeenCalled();
7584
});
7685

77-
it('returns config for development when params is not passed', async () => {
78-
const result = await initConfig({
79-
mode: 'development'
80-
});
86+
describe('no config', () => {
87+
it('returns default docker satellite ID in development if config does not exist', async () => {
88+
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(false);
8189

82-
expect(result).toEqual({
83-
satelliteId: 'jx5yt-yyaaa-aaaal-abzbq-cai',
84-
orbiterId: undefined,
85-
icpIds: {
86-
internetIdentityId: 'rdmx6-jaaaa-aaaaa-aaadq-cai',
87-
icpLedgerId: 'ryjl3-tyaaa-aaaaa-aaaba-cai',
88-
icpIndexId: 'qhbym-qaaaa-aaaaa-aaafq-cai'
89-
},
90-
container: 'http://127.0.0.1:5987'
90+
const result = await initConfig({
91+
params: {},
92+
mode: 'development'
93+
});
94+
95+
expect(result).toEqual({
96+
orbiterId: undefined,
97+
satelliteId: DOCKER_SATELLITE_ID,
98+
icpIds: {
99+
internetIdentityId: INTERNET_IDENTITY_ID,
100+
icpLedgerId: ICP_LEDGER_ID,
101+
icpIndexId: ICP_INDEX_ID
102+
},
103+
container: DOCKER_CONTAINER_URL
104+
});
105+
106+
expect(configLoader.junoConfigExist).toHaveBeenCalled();
107+
expect(spyReadJunoConfig).not.toHaveBeenCalled();
91108
});
92109

93-
expect(spyJunoConfigExist).not.toHaveBeenCalled();
94-
expect(spyReadJunoConfig).not.toHaveBeenCalled();
110+
it('returns fallback Docker satellite ID when using container and config does not exist and container is specified', async () => {
111+
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(false);
112+
113+
const result = await initConfig({
114+
params: {container: true},
115+
mode: 'development'
116+
});
117+
118+
expect(result).toEqual({
119+
satelliteId: DOCKER_SATELLITE_ID,
120+
orbiterId: undefined,
121+
icpIds: {
122+
internetIdentityId: INTERNET_IDENTITY_ID,
123+
icpLedgerId: ICP_LEDGER_ID,
124+
icpIndexId: ICP_INDEX_ID
125+
},
126+
container: DOCKER_CONTAINER_URL
127+
});
128+
129+
expect(configLoader.junoConfigExist).toHaveBeenCalled();
130+
expect(spyReadJunoConfig).not.toHaveBeenCalled();
131+
});
95132
});
96133

97134
it('returns config for production when params is not passed', async () => {
@@ -103,9 +140,9 @@ describe('init', () => {
103140
satelliteId: 'mock-satellite-id',
104141
orbiterId: 'mock-orbiter-id',
105142
icpIds: {
106-
internetIdentityId: 'rdmx6-jaaaa-aaaaa-aaadq-cai',
107-
icpLedgerId: 'ryjl3-tyaaa-aaaaa-aaaba-cai',
108-
icpIndexId: 'qhbym-qaaaa-aaaaa-aaafq-cai'
143+
internetIdentityId: INTERNET_IDENTITY_ID,
144+
icpLedgerId: ICP_LEDGER_ID,
145+
icpIndexId: ICP_INDEX_ID
109146
},
110147
container: undefined
111148
});
@@ -114,27 +151,30 @@ describe('init', () => {
114151
expect(spyReadJunoConfig).toHaveBeenCalled();
115152
});
116153

117-
it('skips assertJunoConfig when using Docker container', async () => {
118-
const dockerArgs: ConfigArgs = {
154+
it('returns satellite ID from config when using container and config exists', async () => {
155+
vi.spyOn(configLoader, 'junoConfigExist').mockResolvedValue(true);
156+
vi.spyOn(configLoader, 'readJunoConfig').mockResolvedValue({
157+
satellite: {ids: {development: 'custom-docker-id'}}
158+
});
159+
160+
const result = await initConfig({
119161
params: {container: true},
120162
mode: 'development'
121-
};
122-
123-
const result = await initConfig(dockerArgs);
163+
});
124164

125165
expect(result).toEqual({
126-
satelliteId: 'jx5yt-yyaaa-aaaal-abzbq-cai', // fallback to docker const
166+
satelliteId: 'custom-docker-id',
127167
orbiterId: undefined,
128168
icpIds: {
129-
internetIdentityId: 'rdmx6-jaaaa-aaaaa-aaadq-cai',
130-
icpLedgerId: 'ryjl3-tyaaa-aaaaa-aaaba-cai',
131-
icpIndexId: 'qhbym-qaaaa-aaaaa-aaafq-cai'
169+
internetIdentityId: INTERNET_IDENTITY_ID,
170+
icpLedgerId: ICP_LEDGER_ID,
171+
icpIndexId: ICP_INDEX_ID
132172
},
133-
container: 'http://127.0.0.1:5987'
173+
container: DOCKER_CONTAINER_URL
134174
});
135175

136-
expect(spyJunoConfigExist).not.toHaveBeenCalled();
137-
expect(spyReadJunoConfig).not.toHaveBeenCalled();
176+
expect(configLoader.junoConfigExist).toHaveBeenCalled();
177+
expect(configLoader.readJunoConfig).toHaveBeenCalled();
138178
});
139179

140180
it('throws if config does not exist and mode is production', async () => {

0 commit comments

Comments
 (0)