Added the gitignore file and the tests.
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# Ignore the possible nginx directory that might be used to build in
|
||||
nginx/**
|
||||
183
tests/tests.py
Normal file
183
tests/tests.py
Normal 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()
|
||||
Reference in New Issue
Block a user