Skip to content

Commit fc5bbaa

Browse files
feat(files): add unit tests
1 parent 4c181fc commit fc5bbaa

File tree

3 files changed

+309
-1
lines changed

3 files changed

+309
-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: 273 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,275 @@ 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+
# Download and compare to original
1067+
txt = f.download(encoding='utf-8')
1068+
assert txt == open(TEST_DIR / 'test.ipynb').read()
1069+
1070+
# Make sure we can't overwrite
1071+
with self.assertRaises(OSError):
1072+
space.upload_file(
1073+
TEST_DIR / 'test.ipynb',
1074+
'upload_test.ipynb',
1075+
)
1076+
1077+
# Force overwrite with new content
1078+
f = space.upload_file(
1079+
TEST_DIR / 'test2.ipynb',
1080+
'upload_test.ipynb', overwrite=True,
1081+
)
1082+
assert str(f.path) == 'upload_test.ipynb'
1083+
assert f.type == 'notebook'
1084+
1085+
# Verify new content
1086+
txt = f.download(encoding='utf-8')
1087+
assert txt == open(TEST_DIR / 'test2.ipynb').read()
1088+
1089+
# Make sure we can't upload a folder
1090+
with self.assertRaises(s2.ManagementError):
1091+
space.upload_folder(TEST_DIR, 'test')
1092+
1093+
# Cleanup
1094+
space.remove('upload_test.ipynb')
1095+
1096+
def test_open(self):
1097+
for space in [self.personal_space, self.shared_space]:
1098+
# See if error is raised for non-existent file
1099+
with self.assertRaises(s2.ManagementError):
1100+
space.open('open_test.ipynb', 'r')
1101+
1102+
# Load test file
1103+
space.upload_file(TEST_DIR / 'test.ipynb', 'open_test.ipynb')
1104+
1105+
# Read file using `open`
1106+
with space.open('open_test.ipynb', 'r') as rfile:
1107+
assert rfile.read() == open(TEST_DIR / 'test.ipynb').read()
1108+
1109+
# Read file using `open` with 'rt' mode
1110+
with space.open('open_test.ipynb', 'rt') as rfile:
1111+
assert rfile.read() == open(TEST_DIR / 'test.ipynb').read()
1112+
1113+
# Read file using `open` with 'rb' mode
1114+
with space.open('open_test.ipynb', 'rb') as rfile:
1115+
assert rfile.read() == open(TEST_DIR / 'test.ipynb', 'rb').read()
1116+
1117+
# Read file using `open` with 'rb' mode
1118+
with self.assertRaises(ValueError):
1119+
with space.open('open_test.ipynb', 'b') as rfile:
1120+
pass
1121+
1122+
# Attempt overwrite file using `open` with mode 'x'
1123+
with self.assertRaises(OSError):
1124+
with space.open('open_test.ipynb', 'x') as wfile:
1125+
pass
1126+
1127+
# Attempt overwrite file using `open` with mode 'w'
1128+
with space.open('open_test.ipynb', 'w') as wfile:
1129+
wfile.write(open(TEST_DIR / 'test2.ipynb').read())
1130+
1131+
txt = space.download_file('open_test.ipynb', encoding='utf-8')
1132+
1133+
assert txt == open(TEST_DIR / 'test2.ipynb').read()
1134+
1135+
# Test writer without context manager
1136+
wfile = space.open('open_raw_test.ipynb', 'w')
1137+
for line in open(TEST_DIR / 'test.ipynb'):
1138+
wfile.write(line)
1139+
wfile.close()
1140+
1141+
txt = space.download_file(
1142+
'open_raw_test.ipynb',
1143+
encoding='utf-8',
1144+
)
1145+
1146+
assert txt == open(TEST_DIR / 'test.ipynb').read()
1147+
1148+
# Test reader without context manager
1149+
rfile = space.open('open_raw_test.ipynb', 'r')
1150+
txt = ''
1151+
for line in rfile:
1152+
txt += line
1153+
rfile.close()
1154+
1155+
assert txt == open(TEST_DIR / 'test.ipynb').read()
1156+
1157+
# Cleanup
1158+
space.remove('open_test.ipynb')
1159+
space.remove('open_raw_test.ipynb')
1160+
1161+
def test_obj_open(self):
1162+
for space in [self.personal_space, self.shared_space]:
1163+
# Load test file
1164+
f = space.upload_file(
1165+
TEST_DIR / 'test.ipynb',
1166+
'obj_open_test.ipynb',
1167+
)
1168+
1169+
# Read file using `open`
1170+
with f.open() as rfile:
1171+
assert rfile.read() == open(TEST_DIR / 'test.ipynb').read()
1172+
1173+
# Make sure directories error out
1174+
with self.assertRaises(s2.ManagementError):
1175+
space.mkdir('obj_open_dir')
1176+
1177+
# Write file using `open`
1178+
with f.open('w', encoding='utf-8') as wfile:
1179+
wfile.write(open(TEST_DIR / 'test2.ipynb').read())
1180+
1181+
assert f.download(encoding='utf-8') == open(TEST_DIR / 'test2.ipynb').read()
1182+
1183+
# Test writer without context manager
1184+
wfile = f.open('w')
1185+
for line in open(TEST_DIR / 'test.ipynb'):
1186+
wfile.write(line)
1187+
wfile.close()
1188+
1189+
txt = space.download_file(f.path, encoding='utf-8')
1190+
1191+
assert txt == open(TEST_DIR / 'test.ipynb').read()
1192+
1193+
# Test reader without context manager
1194+
rfile = f.open('r')
1195+
txt = ''
1196+
for line in rfile:
1197+
txt += line
1198+
rfile.close()
1199+
1200+
assert txt == open(TEST_DIR / 'test.ipynb').read()
1201+
1202+
# Cleanup
1203+
space.remove('obj_open_test.ipynb')
1204+
1205+
def test_os_directories(self):
1206+
for space in [self.personal_space, self.shared_space]:
1207+
# Make sure directories error out
1208+
with self.assertRaises(s2.ManagementError):
1209+
space.mkdir('mkdir_test_1')
1210+
1211+
with self.assertRaises(s2.ManagementError):
1212+
space.exists('mkdir_test_1/')
1213+
1214+
out = space.listdir('/')
1215+
assert 'mkdir_test_1/' not in out
1216+
1217+
with self.assertRaises(s2.ManagementError):
1218+
space.rmdir('mkdir_test_1/')
1219+
1220+
def test_os_rename(self):
1221+
for space in [self.personal_space, self.shared_space]:
1222+
space.upload_file(
1223+
TEST_DIR / 'test.ipynb',
1224+
'rename_test.ipynb',
1225+
)
1226+
assert 'rename_test.ipynb' in space.listdir('/')
1227+
assert 'rename_test_2.ipynb' not in space.listdir('/')
1228+
1229+
space.rename(
1230+
'rename_test.ipynb',
1231+
'rename_test_2.ipynb',
1232+
)
1233+
assert 'rename_test.ipynb' not in space.listdir('/')
1234+
assert 'rename_test_2.ipynb' in space.listdir('/')
1235+
1236+
# non-existent file
1237+
with self.assertRaises(OSError):
1238+
space.rename('rename_foo.ipynb', 'rename_foo_2.ipynb')
1239+
1240+
space.upload_file(
1241+
TEST_DIR / 'test.ipynb',
1242+
'rename_test_3.ipynb',
1243+
)
1244+
1245+
# overwrite
1246+
with self.assertRaises(OSError):
1247+
space.rename(
1248+
'rename_test_2.ipynb',
1249+
'rename_test_3.ipynb',
1250+
)
1251+
1252+
space.rename(
1253+
'rename_test_2.ipynb',
1254+
'rename_test_3.ipynb', overwrite=True,
1255+
)
1256+
1257+
# Cleanup
1258+
space.remove('rename_test_3.ipynb')
1259+
1260+
def test_file_object(self):
1261+
for space in [self.personal_space, self.shared_space]:
1262+
f = space.upload_file(
1263+
TEST_DIR / 'test.ipynb',
1264+
'obj_test.ipynb',
1265+
)
1266+
1267+
assert not f.is_dir()
1268+
assert f.is_file()
1269+
1270+
# abspath / basename / dirname / exists
1271+
assert f.abspath() == 'obj_test.ipynb'
1272+
assert f.basename() == 'obj_test.ipynb'
1273+
assert f.dirname() == '/'
1274+
assert f.exists()
1275+
1276+
# download
1277+
assert f.download(encoding='utf-8') == \
1278+
open(TEST_DIR / 'test.ipynb', 'r').read()
1279+
assert f.download() == open(TEST_DIR / 'test.ipynb', 'rb').read()
1280+
1281+
assert space.is_file('obj_test.ipynb')
1282+
f.remove()
1283+
assert not space.is_file('obj_test.ipynb')
1284+
1285+
# mtime / ctime
1286+
assert f.getmtime() > 0
1287+
assert f.getctime() > 0
1288+
1289+
# rename
1290+
f = space.upload_file(
1291+
TEST_DIR / 'test.ipynb',
1292+
'obj_test.ipynb',
1293+
)
1294+
assert space.exists('obj_test.ipynb')
1295+
assert not space.exists('obj_test_2.ipynb')
1296+
f.rename('obj_test_2.ipynb')
1297+
assert not space.exists('obj_test.ipynb')
1298+
assert space.exists('obj_test_2.ipynb')
1299+
assert f.abspath() == 'obj_test_2.ipynb'
1300+
1301+
# Cleanup
1302+
space.remove('obj_test_2.ipynb')

0 commit comments

Comments
 (0)