Skip to content

Commit fb832b4

Browse files
committed
SQ index 404
1 parent 9725797 commit fb832b4

File tree

2 files changed

+63
-5
lines changed

2 files changed

+63
-5
lines changed

shapeflow/server.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
from threading import Thread, Event, Lock
66
from typing import Optional
77

8-
from flask import Flask, send_from_directory, jsonify, request, Response, make_response, abort
8+
import flask
9+
from flask import Flask, jsonify, request, Response, make_response, abort
910
import waitress
1011
import webbrowser
1112

@@ -106,11 +107,14 @@ def _index():
106107
log.error(f"no compiled UI in '{DIST}'")
107108
log.error(f"follow the instructions on the 404 page to restore the application")
108109

109-
return send_from_directory(UI, '404.html')
110+
return flask.send_from_directory(UI, '404.html'), 404
110111

111112
@app.route('/<path:file>', methods=['GET'])
112113
def _get_file(file: str):
113-
return self.get_file(file)
114+
try:
115+
return self.get_file(file)
116+
except FileNotFoundError:
117+
abort(404)
114118

115119
@app.route('/api/<path:address>', methods=['GET', 'POST', 'PUT'])
116120
def _call_api(address: str):
@@ -172,7 +176,7 @@ def get_file(self, file: str):
172176
log.error(f"no such file: '{file}'")
173177
raise FileNotFoundError
174178
log.debug(f"serving '{file}'")
175-
return send_from_directory(
179+
return flask.send_from_directory(
176180
os.path.dirname(path),
177181
os.path.basename(path)
178182
)

test/test_server.py

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
import os
22
import shutil
33
import unittest
4+
from unittest.mock import patch
45
from contextlib import contextmanager
56

67
import time
78
import json
89
import subprocess
910

11+
import flask
12+
from flask.testing import FlaskClient
13+
1014
from shapeflow import settings, ROOTDIR, save_settings
15+
from shapeflow.server import ShapeflowServer, UI, DIST
1116

1217
CACHE = os.path.join(ROOTDIR, 'test_main-cache')
1318
DB = os.path.join(ROOTDIR, 'test_main-history.db')
@@ -169,6 +174,55 @@ def test_set_settings_restart(self):
169174
post(api('set_settings'), data=json.dumps({'settings': first_settings}))
170175
time.sleep(10)
171176

177+
178+
@patch('os.path.isfile')
179+
@patch('os.path.isdir')
180+
@patch('flask.send_from_directory')
181+
class FlaskTest(unittest.TestCase):
182+
client: FlaskClient
183+
184+
def setUp(self) -> None:
185+
sfs = ShapeflowServer()
186+
sfs._app.config['TESTING'] = True
187+
188+
self.client = sfs._app.test_client()
189+
190+
def test_serve_index_200(self, send_from_directory, _, isfile):
191+
isfile.return_value = True
192+
send_from_directory.return_value = flask.Response()
193+
194+
r = self.client.get('/')
195+
196+
send_from_directory.assert_called_with(DIST, 'index.html')
197+
self.assertEqual(r.status_code, 200)
198+
199+
def test_serve_index_404(self, send_from_directory, _, isfile):
200+
isfile.return_value = False
201+
send_from_directory.return_value = flask.Response()
202+
203+
r = self.client.get('/')
204+
205+
send_from_directory.assert_called_with(UI, '404.html')
206+
self.assertEqual(r.status_code, 404)
207+
208+
def test_serve_file_200(self, send_from_directory, _, isfile):
209+
isfile.return_value = True
210+
send_from_directory.return_value = flask.Response()
211+
212+
r = self.client.get('/something.txt')
213+
214+
send_from_directory.assert_called_with(DIST, 'something.txt')
215+
self.assertEqual(r.status_code, 200)
216+
217+
def test_serve_file_404(self, send_from_directory, _, isfile):
218+
isfile.return_value = False
219+
send_from_directory.return_value = flask.Response()
220+
221+
r = self.client.get('/something.txt')
222+
223+
send_from_directory.assert_not_called()
224+
self.assertEqual(r.status_code, 404)
225+
226+
172227
if __name__ == '__main__':
173228
unittest.main()
174-

0 commit comments

Comments
 (0)