Skip to content

Commit 4401234

Browse files
feat(files): add unit tests
1 parent 076b4d7 commit 4401234

File tree

3 files changed

+324
-1
lines changed

3 files changed

+324
-1
lines changed

singlestoredb/tests/test.ipynb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"metadata": {},
6+
"source": [
7+
"Test Notebook"
8+
]
9+
}
10+
],
11+
"metadata": {
12+
"language_info": {
13+
"name": "python"
14+
}
15+
},
16+
"nbformat": 4,
17+
"nbformat_minor": 2
18+
}

singlestoredb/tests/test2.ipynb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"metadata": {},
6+
"source": [
7+
"Test Notebook 2"
8+
]
9+
}
10+
],
11+
"metadata": {
12+
"language_info": {
13+
"name": "python"
14+
}
15+
},
16+
"nbformat": 4,
17+
"nbformat_minor": 2
18+
}

singlestoredb/tests/test_management.py

Lines changed: 288 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,7 @@ def test_os_rename(self):
740740
'rename_test_2/nest_1/nested_rename_test_3.sql', overwrite=True,
741741
)
742742

743-
def test_stage_object(self):
743+
def test_file_object(self):
744744
st = self.wg.stage
745745

746746
st.mkdir('obj_test')
@@ -1028,3 +1028,290 @@ def test_job_with_database_target(self):
10281028
assert deleted
10291029
job = job_manager.get(job.job_id)
10301030
assert job.terminated_at is not None
1031+
1032+
1033+
@pytest.mark.management
1034+
class TestFileSpaces(unittest.TestCase):
1035+
1036+
manager = None
1037+
personal_space = None
1038+
shared_space = None
1039+
1040+
@classmethod
1041+
def setUpClass(cls):
1042+
cls.manager = s2.manage_files()
1043+
cls.personal_space = cls.manager.personal_space
1044+
cls.shared_space = cls.manager.shared_space
1045+
1046+
@classmethod
1047+
def tearDownClass(cls):
1048+
cls.manager = None
1049+
cls.personal_space = None
1050+
cls.shared_space = None
1051+
1052+
def test_upload_file(self):
1053+
for space in [self.personal_space, self.shared_space]:
1054+
root = space.info('/')
1055+
assert str(root.path) == '/'
1056+
assert root.type == 'directory'
1057+
1058+
# Upload files
1059+
f = space.upload_file(
1060+
TEST_DIR / 'test.ipynb',
1061+
'upload_test.ipynb',
1062+
)
1063+
assert str(f.path) == 'upload_test.ipynb'
1064+
assert f.type == 'notebook'
1065+
1066+
if space == self.personal_space:
1067+
space.upload_file(
1068+
TEST_DIR / 'test.sql',
1069+
'upload_test.sql',
1070+
)
1071+
1072+
# Cleanup
1073+
space.remove('upload_test.sql')
1074+
elif space == self.shared_space:
1075+
with self.assertRaises(s2.ManagementError):
1076+
space.upload_file(
1077+
TEST_DIR / 'test.sql',
1078+
'upload_test.sql',
1079+
)
1080+
1081+
# Download and compare to original
1082+
txt = f.download(encoding='utf-8')
1083+
assert txt == open(TEST_DIR / 'test.ipynb').read()
1084+
1085+
# Make sure we can't overwrite
1086+
with self.assertRaises(OSError):
1087+
space.upload_file(
1088+
TEST_DIR / 'test.ipynb',
1089+
'upload_test.ipynb',
1090+
)
1091+
1092+
# Force overwrite with new content
1093+
f = space.upload_file(
1094+
TEST_DIR / 'test2.ipynb',
1095+
'upload_test.ipynb', overwrite=True,
1096+
)
1097+
assert str(f.path) == 'upload_test.ipynb'
1098+
assert f.type == 'notebook'
1099+
1100+
# Verify new content
1101+
txt = f.download(encoding='utf-8')
1102+
assert txt == open(TEST_DIR / 'test2.ipynb').read()
1103+
1104+
# Make sure we can't upload a folder
1105+
with self.assertRaises(s2.ManagementError):
1106+
space.upload_folder(TEST_DIR, 'test')
1107+
1108+
# Cleanup
1109+
space.remove('upload_test.ipynb')
1110+
1111+
def test_open(self):
1112+
for space in [self.personal_space, self.shared_space]:
1113+
# See if error is raised for non-existent file
1114+
with self.assertRaises(s2.ManagementError):
1115+
space.open('open_test.ipynb', 'r')
1116+
1117+
# Load test file
1118+
space.upload_file(TEST_DIR / 'test.ipynb', 'open_test.ipynb')
1119+
1120+
# Read file using `open`
1121+
with space.open('open_test.ipynb', 'r') as rfile:
1122+
assert rfile.read() == open(TEST_DIR / 'test.ipynb').read()
1123+
1124+
# Read file using `open` with 'rt' mode
1125+
with space.open('open_test.ipynb', 'rt') as rfile:
1126+
assert rfile.read() == open(TEST_DIR / 'test.ipynb').read()
1127+
1128+
# Read file using `open` with 'rb' mode
1129+
with space.open('open_test.ipynb', 'rb') as rfile:
1130+
assert rfile.read() == open(TEST_DIR / 'test.ipynb', 'rb').read()
1131+
1132+
# Read file using `open` with 'rb' mode
1133+
with self.assertRaises(ValueError):
1134+
with space.open('open_test.ipynb', 'b') as rfile:
1135+
pass
1136+
1137+
# Attempt overwrite file using `open` with mode 'x'
1138+
with self.assertRaises(OSError):
1139+
with space.open('open_test.ipynb', 'x') as wfile:
1140+
pass
1141+
1142+
# Attempt overwrite file using `open` with mode 'w'
1143+
with space.open('open_test.ipynb', 'w') as wfile:
1144+
wfile.write(open(TEST_DIR / 'test2.ipynb').read())
1145+
1146+
txt = space.download_file('open_test.ipynb', encoding='utf-8')
1147+
1148+
assert txt == open(TEST_DIR / 'test2.ipynb').read()
1149+
1150+
# Test writer without context manager
1151+
wfile = space.open('open_raw_test.ipynb', 'w')
1152+
for line in open(TEST_DIR / 'test.ipynb'):
1153+
wfile.write(line)
1154+
wfile.close()
1155+
1156+
txt = space.download_file(
1157+
'open_raw_test.ipynb',
1158+
encoding='utf-8',
1159+
)
1160+
1161+
assert txt == open(TEST_DIR / 'test.ipynb').read()
1162+
1163+
# Test reader without context manager
1164+
rfile = space.open('open_raw_test.ipynb', 'r')
1165+
txt = ''
1166+
for line in rfile:
1167+
txt += line
1168+
rfile.close()
1169+
1170+
assert txt == open(TEST_DIR / 'test.ipynb').read()
1171+
1172+
# Cleanup
1173+
space.remove('open_test.ipynb')
1174+
space.remove('open_raw_test.ipynb')
1175+
1176+
def test_obj_open(self):
1177+
for space in [self.personal_space, self.shared_space]:
1178+
# Load test file
1179+
f = space.upload_file(
1180+
TEST_DIR / 'test.ipynb',
1181+
'obj_open_test.ipynb',
1182+
)
1183+
1184+
# Read file using `open`
1185+
with f.open() as rfile:
1186+
assert rfile.read() == open(TEST_DIR / 'test.ipynb').read()
1187+
1188+
# Make sure directories error out
1189+
with self.assertRaises(s2.ManagementError):
1190+
space.mkdir('obj_open_dir')
1191+
1192+
# Write file using `open`
1193+
with f.open('w', encoding='utf-8') as wfile:
1194+
wfile.write(open(TEST_DIR / 'test2.ipynb').read())
1195+
1196+
assert f.download(encoding='utf-8') == open(TEST_DIR / 'test2.ipynb').read()
1197+
1198+
# Test writer without context manager
1199+
wfile = f.open('w')
1200+
for line in open(TEST_DIR / 'test.ipynb'):
1201+
wfile.write(line)
1202+
wfile.close()
1203+
1204+
txt = space.download_file(f.path, encoding='utf-8')
1205+
1206+
assert txt == open(TEST_DIR / 'test.ipynb').read()
1207+
1208+
# Test reader without context manager
1209+
rfile = f.open('r')
1210+
txt = ''
1211+
for line in rfile:
1212+
txt += line
1213+
rfile.close()
1214+
1215+
assert txt == open(TEST_DIR / 'test.ipynb').read()
1216+
1217+
# Cleanup
1218+
space.remove('obj_open_test.ipynb')
1219+
1220+
def test_os_directories(self):
1221+
for space in [self.personal_space, self.shared_space]:
1222+
# Make sure directories error out
1223+
with self.assertRaises(s2.ManagementError):
1224+
space.mkdir('mkdir_test_1')
1225+
1226+
with self.assertRaises(s2.ManagementError):
1227+
space.exists('mkdir_test_1/')
1228+
1229+
out = space.listdir('/')
1230+
assert 'mkdir_test_1/' not in out
1231+
1232+
with self.assertRaises(s2.ManagementError):
1233+
space.rmdir('mkdir_test_1/')
1234+
1235+
def test_os_rename(self):
1236+
for space in [self.personal_space, self.shared_space]:
1237+
space.upload_file(
1238+
TEST_DIR / 'test.ipynb',
1239+
'rename_test.ipynb',
1240+
)
1241+
assert 'rename_test.ipynb' in space.listdir('/')
1242+
assert 'rename_test_2.ipynb' not in space.listdir('/')
1243+
1244+
space.rename(
1245+
'rename_test.ipynb',
1246+
'rename_test_2.ipynb',
1247+
)
1248+
assert 'rename_test.ipynb' not in space.listdir('/')
1249+
assert 'rename_test_2.ipynb' in space.listdir('/')
1250+
1251+
# non-existent file
1252+
with self.assertRaises(OSError):
1253+
space.rename('rename_foo.ipynb', 'rename_foo_2.ipynb')
1254+
1255+
space.upload_file(
1256+
TEST_DIR / 'test.ipynb',
1257+
'rename_test_3.ipynb',
1258+
)
1259+
1260+
# overwrite
1261+
with self.assertRaises(OSError):
1262+
space.rename(
1263+
'rename_test_2.ipynb',
1264+
'rename_test_3.ipynb',
1265+
)
1266+
1267+
space.rename(
1268+
'rename_test_2.ipynb',
1269+
'rename_test_3.ipynb', overwrite=True,
1270+
)
1271+
1272+
# Cleanup
1273+
space.remove('rename_test_3.ipynb')
1274+
1275+
def test_file_object(self):
1276+
for space in [self.personal_space, self.shared_space]:
1277+
f = space.upload_file(
1278+
TEST_DIR / 'test.ipynb',
1279+
'obj_test.ipynb',
1280+
)
1281+
1282+
assert not f.is_dir()
1283+
assert f.is_file()
1284+
1285+
# abspath / basename / dirname / exists
1286+
assert f.abspath() == 'obj_test.ipynb'
1287+
assert f.basename() == 'obj_test.ipynb'
1288+
assert f.dirname() == '/'
1289+
assert f.exists()
1290+
1291+
# download
1292+
assert f.download(encoding='utf-8') == \
1293+
open(TEST_DIR / 'test.ipynb', 'r').read()
1294+
assert f.download() == open(TEST_DIR / 'test.ipynb', 'rb').read()
1295+
1296+
assert space.is_file('obj_test.ipynb')
1297+
f.remove()
1298+
assert not space.is_file('obj_test.ipynb')
1299+
1300+
# mtime / ctime
1301+
assert f.getmtime() > 0
1302+
assert f.getctime() > 0
1303+
1304+
# rename
1305+
f = space.upload_file(
1306+
TEST_DIR / 'test.ipynb',
1307+
'obj_test.ipynb',
1308+
)
1309+
assert space.exists('obj_test.ipynb')
1310+
assert not space.exists('obj_test_2.ipynb')
1311+
f.rename('obj_test_2.ipynb')
1312+
assert not space.exists('obj_test.ipynb')
1313+
assert space.exists('obj_test_2.ipynb')
1314+
assert f.abspath() == 'obj_test_2.ipynb'
1315+
1316+
# Cleanup
1317+
space.remove('obj_test_2.ipynb')

0 commit comments

Comments
 (0)