22 * @jest -environment node
33 */
44import { SiteServer } from 'src/site-server' ;
5+ import { createCliServerProcess } from 'src/modules/cli/lib/cli-server-process' ;
56
67// Electron's Node.js environment provides `bota`/`atob`, but Jests' does not
78jest . mock ( 'common/lib/passwords' ) ;
89
9- // `SiteServer::start` uses `getPreferredSiteLanguage` to set the site language
10- jest . mock ( 'src/lib/site-language' , ( ) => ( {
11- getPreferredSiteLanguage : jest . fn ( ) . mockResolvedValue ( 'en' ) ,
12- } ) ) ;
10+ // Mock the CLI server process
11+ jest . mock ( 'src/modules/cli/lib/cli-server-process' ) ;
1312
1413// Mock the WordPress provider
1514jest . mock ( 'src/lib/wordpress-provider' , ( ) => {
@@ -18,31 +17,6 @@ jest.mock( 'src/lib/wordpress-provider', () => {
1817 DEFAULT_WORDPRESS_VERSION : 'latest' ,
1918 ALLOWED_PHP_VERSIONS : [ '8.0' , '8.1' , '8.2' , '8.3' ] ,
2019 SQLITE_FILENAME : 'sqlite-database-integration' ,
21- getWordPressVersionPath : jest . fn ( ( version ) => `/mock/path/to/wp-${ version } ` ) ,
22- getSqlitePath : jest . fn ( ( ) => '/mock/path/to/sqlite' ) ,
23- getWpCliPath : jest . fn ( ( ) => '/mock/path/to/wp-cli' ) ,
24- getWpCliFolderPath : jest . fn ( ( ) => '/mock/path/to/wp-cli-folder' ) ,
25- downloadWordPress : jest . fn ( ) ,
26- downloadWpCli : jest . fn ( ) ,
27- downloadSQLiteCommand : jest . fn ( ) ,
28- setupWordPressSite : jest . fn ( ( ) => Promise . resolve ( true ) ) ,
29- startServer : jest . fn ( ( ) =>
30- Promise . resolve ( {
31- url : 'http://localhost:1234' ,
32- options : { port : 1234 , phpVersion : '8.0' } ,
33- _internal : { mode : 'wordpress' , port : 1234 } ,
34- } )
35- ) ,
36- createServerProcess : jest . fn ( ( ) => ( {
37- url : 'http://localhost:1234' ,
38- php : { } ,
39- start : jest . fn ( ( ) => Promise . resolve ( ) ) ,
40- stop : jest . fn ( ( ) => Promise . resolve ( ) ) ,
41- runPhp : jest . fn ( ( ) => Promise . resolve ( '' ) ) ,
42- } ) ) ,
43- executeWPCli : jest . fn ( ) ,
44- isValidWordPressVersion : jest . fn ( ( ) => true ) ,
45- getConfig : jest . fn ( ( ) => Promise . resolve ( { } ) ) ,
4620 } ;
4721
4822 return {
@@ -51,23 +25,32 @@ jest.mock( 'src/lib/wordpress-provider', () => {
5125 } ;
5226} ) ;
5327
54- // Mock the wp-now config that the provider uses internally
55- jest . mock ( 'vendor/wp-now/src' , ( ) => ( {
56- getWpNowConfig : jest . fn ( ( ) => ( { mode : 'wordpress' , port : 1234 } ) ) ,
28+ // Mock port finder
29+ jest . mock ( 'common/lib/port-finder' , ( ) => ( {
30+ portFinder : {
31+ isPortAvailable : jest . fn ( ( ) => Promise . resolve ( true ) ) ,
32+ } ,
33+ } ) ) ;
34+
35+ // Mock user data
36+ jest . mock ( 'src/storage/user-data' , ( ) => ( {
37+ loadUserData : jest . fn ( ( ) => Promise . resolve ( { sites : [ ] } ) ) ,
5738} ) ) ;
5839
5940describe ( 'SiteServer' , ( ) => {
41+ beforeEach ( ( ) => {
42+ jest . clearAllMocks ( ) ;
43+ } ) ;
44+
6045 describe ( 'start' , ( ) => {
61- it ( 'should throw if the server starts with a non-WordPress mode' , async ( ) => {
62- const { getWpNowConfig } = require ( 'vendor/wp-now/src' ) ;
63- ( getWpNowConfig as jest . Mock ) . mockReturnValue ( { mode : 'theme' , port : 1234 } ) ;
46+ it ( 'should throw if the CLI server fails to start' , async ( ) => {
47+ const mockStart = jest . fn ( ) . mockRejectedValue ( new Error ( 'Failed to start site' ) ) ;
48+ ( createCliServerProcess as jest . Mock ) . mockReturnValue ( {
49+ url : 'http://localhost:1234' ,
50+ start : mockStart ,
51+ stop : jest . fn ( ) ,
52+ } ) ;
6453
65- const { startServer } = require ( 'src/lib/wordpress-provider' ) ;
66- ( startServer as jest . Mock ) . mockRejectedValue (
67- new Error (
68- "Site server started with Playground's 'theme' mode. Studio only supports 'wordpress' mode."
69- )
70- ) ;
7154 const server = SiteServer . create ( {
7255 id : 'test-id' ,
7356 name : 'test-name' ,
@@ -79,9 +62,32 @@ describe( 'SiteServer', () => {
7962 themeDetails : undefined ,
8063 } ) ;
8164
82- await expect ( server . start ( ) ) . rejects . toThrow (
83- "Site server started with Playground's 'theme' mode. Studio only supports 'wordpress' mode."
84- ) ;
65+ await expect ( server . start ( ) ) . rejects . toThrow ( 'Failed to start site' ) ;
66+ } ) ;
67+
68+ it ( 'should start the server successfully' , async ( ) => {
69+ const mockStart = jest . fn ( ) . mockResolvedValue ( undefined ) ;
70+ ( createCliServerProcess as jest . Mock ) . mockReturnValue ( {
71+ url : 'http://localhost:1234' ,
72+ start : mockStart ,
73+ stop : jest . fn ( ) ,
74+ } ) ;
75+
76+ const server = SiteServer . create ( {
77+ id : 'test-id' ,
78+ name : 'test-name' ,
79+ path : 'test-path' ,
80+ port : 1234 ,
81+ adminPassword : 'test-password' ,
82+ phpVersion : '8.3' ,
83+ running : false ,
84+ themeDetails : undefined ,
85+ } ) ;
86+
87+ await server . start ( ) ;
88+
89+ expect ( mockStart ) . toHaveBeenCalled ( ) ;
90+ expect ( server . details . running ) . toBe ( true ) ;
8591 } ) ;
8692 } ) ;
8793} ) ;
0 commit comments