Added the gitignore file and the tests.

This commit is contained in:
2024-04-11 18:56:54 +03:00
parent ad4c8e9811
commit 87f8f19225
2 changed files with 185 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
# Ignore the possible nginx directory that might be used to build in
nginx/**

183
tests/tests.py Normal file
View File

@@ -0,0 +1,183 @@
import unittest
import requests
import random
import string
import time
class TestStringMethods(unittest.TestCase):
methods = ["PROPFIND", "OPTIONS", "LOCK", "UNLOCK",
"GET", "PUT", "DELETE", "MKCOL", "COPY", "MOVE"]
def test_authorization_required(self):
# TODO the dav methods return forbidden instead of auth required
methods = ["PROPFIND", "OPTIONS", "LOCK", "UNLOCK"]
for method in methods:
r = requests.Session().request(method=method,
url='http://localhost:80/')
self.assertEqual(r.status_code, 401)
def test_PROPFIND(self):
r = requests.Session().request(method="PROPFIND",
url='http://localhost:80/',
headers={'Depth': '0'},
auth = ('user1', 'password1'))
self.assertEqual(r.status_code, 207)
#print(r.content.decode('utf-8'))
#self.assertTrue(r.content.decode('utf-8').startswith('''<D:multistatus xmlns:D="DAV:">'''))
def test_OPTIONS(self):
r = requests.Session().request(method="OPTIONS",
url='http://localhost:80/',
auth = ('user1', 'password1'))
self.assertEqual(r.status_code, 200)
self.assertEqual(r.headers["Allow"],
"GET,HEAD,PUT,DELETE,MKCOL,COPY,MOVE,PROPFIND,OPTIONS,LOCK,UNLOCK")
def test_PUT_GET_DELETE(self):
filename = ''.join(random.choice(string.ascii_lowercase) for i in range(48))
# Create a file
r = requests.Session().request(method="PUT",
url=f'http://localhost:80/{filename}',
auth = ('user1', 'password1'),
data="Hello, World!")
self.assertEqual(r.status_code, 201)
# Remaking the PUT request should return 204 no content
r = requests.Session().request(method="PUT",
url=f'http://localhost:80/{filename}',
auth = ('user1', 'password1'),
data="Hello, World!")
self.assertEqual(r.status_code, 204)
# Get it to make sure it's correct
r = requests.Session().request(method="GET",
url=f'http://localhost:80/{filename}',
auth = ('user1', 'password1'))
self.assertEqual(r.status_code, 200)
#self.assertEqual(r.headers['ETag'], '"66115221-d"') TODO the webdav etag seems to be timestamp based
self.assertEqual(r.content, b"Hello, World!")
# Delete the file
r = requests.Session().request(method="DELETE",
url=f'http://localhost:80/{filename}',
auth = ('user1', 'password1'))
self.assertEqual(r.status_code, 204)
def test_MKCOL(self):
filename = ''.join(random.choice(string.ascii_lowercase) for i in range(48))
# Ensure the directory doesn't exist
requests.Session().request(method="DELETE",
url=f'http://localhost:80/{filename}',
auth = ('user1', 'password1'))
# Test
r = requests.Session().request(method="MKCOL",
url=f'http://localhost:80/{filename}',
auth = ('user1', 'password1'))
self.assertEqual(r.status_code, 201)
# Cleanup the new directory
requests.Session().request(method="DELETE",
url=f'http://localhost:80/{filename}',
auth = ('user1', 'password1'))
r = requests.Session().request(method="PROPFIND",
url=f'http://localhost:80/{filename}/',
auth = ('user1', 'password1'))
self.assertEqual(r.status_code, 404)
# Ensure the directory doesn't exist
requests.Session().request(method="DELETE",
url=f'http://localhost:80/{filename}',
auth = ('user1', 'password1'))
# Test
r = requests.Session().request(method="MKCOL",
url=f'http://localhost:80/{filename}/',
auth = ('user1', 'password1'))
self.assertEqual(r.status_code, 201)
# Cleanup the new directory
requests.Session().request(method="DELETE",
url=f'http://localhost:80/{filename}',
auth = ('user1', 'password1'))
r = requests.Session().request(method="PROPFIND",
url=f'http://localhost:80/{filename}/',
auth = ('user1', 'password1'))
self.assertEqual(r.status_code, 404)
def test_LOCK_UNLOCK(self):
# TODO something is going on with 201 and 200, locks with a trailing slash and locks withut
# TODO Lock-Token should be the same whether its with or without a trailing slash
# TODO locking a nonexistent top directory file is fine but a nonexisting directory or a file inside it returns 423
# TODO odd replies with 200
filename = ''.join(random.choice(string.ascii_lowercase) for i in range(48))
# Create a file
r = requests.Session().request(method="PUT",
url=f'http://localhost:80/{filename}',
auth = ('user1', 'password1'),
data="Hello, World!")
self.assertEqual(r.status_code, 201)
# Lock it
r = requests.Session().request(method="LOCK",
url=f'http://localhost:80/{filename}',
auth = ('user1', 'password1'))
self.assertEqual(r.status_code, 200)
r = requests.Session().request(method="UNLOCK",
url=f'http://localhost:80/{filename}',
auth = ('user1', 'password1'))
self.assertEqual(r.status_code, 204)
# TODO the file that was created above should be deleted, need to find out why it fails
#r = requests.Session().request(method="DELETE",
# url=f'http://localhost:80/{filename}',
# auth = ('user1', 'password1'))
#self.assertEqual(r.status_code, 204)
def test_COPY(self):
filename = ''.join(random.choice(string.ascii_lowercase) for i in range(48))
# Ensure the directory doesn't exist
requests.Session().request(method="DELETE",
url=f'http://localhost:80/{filename}',
auth = ('user1', 'password1'))
# Make the directory to copy
r = requests.Session().request(method="MKCOL",
url=f'http://localhost:80/{filename}',
auth = ('user1', 'password1'))
self.assertEqual(r.status_code, 201)
# Copy the directory with various trailing slash configurations
for (i,j) in [('/','/'), ('/',''), ('','/'), ('','')]:
r = requests.Session().request(method="COPY",
url=f'http://localhost:80/{filename}'+i,
auth = ('user1', 'password1'),
headers={'Destination': '/{filename}cpy'+j})
self.assertEqual(r.status_code, 201)
# Delete the directory copy for the next test
# TODO why does this fail??
#r = requests.Session().request(method="DELETE",
# url=f'http://localhost:80/{filename}cpy',
# auth = ('user1', 'password1'))
#self.assertEqual(r.status_code, 204)
def test_MOVE(self):
filename = ''.join(random.choice(string.ascii_lowercase) for i in range(48))
# Copy the directory with various trailing slash configurations
for (i,j) in [('/','/'), ('/',''), ('','/'), ('','')]:
# Make the directory to move
r = requests.Session().request(method="MKCOL",
url='http://localhost:80/{filename}',
auth = ('user1', 'password1'))
self.assertEqual(r.status_code, 201)
r = requests.Session().request(method="MOVE",
url='http://localhost:80/{filename}'+i,
auth = ('user1', 'password1'),
headers={'Destination': '/{filename}mov'+j})
self.assertEqual(r.status_code, 201)
# Delete the directory move for the next test
r = requests.Session().request(method="DELETE",
url='http://localhost:80/{filename}mov',
auth = ('user1', 'password1'))
self.assertEqual(r.status_code, 204)
# Ensure the directory doesn't exist
requests.Session().request(method="DELETE",
url='http://localhost:80/{filename}',
auth = ('user1', 'password1'))
if __name__ == '__main__':
unittest.main()