Тестирование
===
В пакет Webdavclient включены следующие компоненты:
- `webdav API`
- `resource API`
- `wdc`
Каждый из компонентов имеет свою тестовую базу.
### webdav API ###
Компонент webdav API содержит следующие тестовые наборы:
- настройка подключения
- аутентификация
- методы
- интеграционные тесты
#### Настройка подключения ####
Для инициализации клиента используется словарь (настройки подключения), содержащий набор опций подключения к webdav-серверу.
Настройки подключения имеют обязательные и не обязательные опции. К обязательным опциям относятся `webdav_hostname`, `webdav_login` и `webdav_password`.
Заполнение полей может быть валидным или не валидным.
Для проверки используются метод `valid?`.
```python
import webdav.client as wc
options = {
'webdav_hostname': "https://webdav.server.ru",
'webdav_login': "login",
'webdav_password': "password"
}
client = wc.Client(options)
client.valid?
```
*Тестовый сценарий 1*
Идентификатор: 1.1.1
Название: Обязательные опции подключения
Описание: В случае присутствия каждой из обязательных опций,
настройки подключения клиента будут валидными.
Красный случай
```python
assert_that(client, is_(not_valid())
```
Зеленый случай
```python
assert_that(client, is_(valid())
```
*Тестовый сценарий 2*
Идентификатор: 1.1.2
Название: Валидность обязательных опций подключения
Описание: В случае валидности обязательных опций,
настройки подключения клиента будут валидными.
Красный случай
```python
#without webdav_hostname
#without webdav_login
#without webdav_password
#with proxy_login or proxy_password, but without proxy_hostname
#with proxy_password and proxy_hostname, but without proxy_login
assert_that(client, is_(not_valid())
```
Зеленый случай
```python
assert_that(client, is_(valid())
```
*Тестовый сценарий 3*
Идентификатор: 1.1.3
Название: Валидность сертификата
Описание: При указании валидного файла и ключа сертификата,
настройки подключения клиента будут валидными.
Красный случай
```python
#with key_path, but without cert_path
#key_path or cert_path not exists
assert_that(calling(client.is_valid), raises(CertificateNotValid))
```
Зеленый случай
```python
assert_that(calling(client.is_valid), is_not(raises(CertificateNotValid))
```
#### Аутентификация ####
При подключении к webdav-серверу, необходимо пройти у него basic-аутентификацию, для этого используются опции `webdav_login` и `webdav_password`. При наличии proxy-сервера, может потребоваться так же пройти аутентификацию и у proxy-сервера. Для proxy-сервера поддерживаются следующие виды аутентификации:
- `basic`
- `digest`
- `ntlm`
- `negotiate`
*Тестовый сценарий 1*
Идентификатор: 1.2.1
Название: Аутентификация с webdav-сервером
Описание: При правильной аутентификации клиент подключается к webdav-серверу.
Красный случай
```python
assert_that(calling(client.check), is_(not_suceess())
```
Зеленый случай
```python
assert_that(calling(client.check), is_(suceess())
```
*Тестовый сценарий 2*
Идентификатор: 1.2.2
Название: Аутентификация с proxy-сервером
Описание: При правильной аутентификации клиент подключается к webdav-серверу.
Красный случай
```python
assert_that(calling(client.check), is_(not_suceess())
```
Зеленый случай
```python
#basic
#digest
#ntlm
#negotiate
assert_that(calling(client.check), is_(suceess())
```
#### Методы ####
webdav API реализует следущие методы: `check`, `free`, `info`, `list`, `mkdir`, `clean`, `copy`, `move`, `download`, `upload`, `publish` и `unpublish`.
*Тестовый сценарий 1*
Идентификатор: 1.3.1
Название: Проверка существования ресурса
Описание: В случае существования ресурса, результат выполнения метода check
будет успешным.
Красный случай
```python
assert_that(calling(client.check).with_args(remote_path), is_(not_suceess())
```
Зеленый случай
```python
assert_that(calling(client.check).with_args(remote_path), is_(suceess())
```
*Тестовый сценарий 2*
Идентификатор: 1.3.2
Название: Проверка свободного места
Описание: В случае если webdav-сервер поддерживает метод free, метод возвращает
размер свободного места.
Красный случай
```python
assert_that(calling(client.free), raises(MethodNotSupported))
```
Зеленый случай
```python
assert_that(calling(client.free), greater_than(0))
```
*Тестовый сценарий 3*
Идентификатор: 1.3.3
Название: Получение информации о ресурсе
Описание: В случае если webdav-сервер поддерживает метод info,
метод возвращает информацию следующего типа:
- дата создания;
- дата модификации;
- размер;
- имя.
Красный случай
```python
assert_that(calling(client.info).with_args(remote_path), raises(RemoteResourceNotFound))
```
Зеленый случай
```python
info = client(remote_path)
assert_that(info, has_key("data1"))
assert_that(info, has_key("data2"))
assert_that(info, has_key("size"))
assert_that(info, has_key("name"))
```
*Тестовый сценарий 4*
Идентификатор: 1.3.4
Название: Получение списка ресурсов
Описание: В случае, если указанный ресурс существует и является директорией, то метод list
возвращает список ресурсов, находящихся в данном ресурсе.
Красный случай
```python
assert_that(calling(client.info).with_args(remote_file), raises(RemoteResourceNotFound))
assert_that(calling(client.list).with_args(remote_path), raises(RemoteResourceNotFound))
```
Зеленый случай
```python
files = client.list(remote_path)
assert_that(files, not_none()))
```
*Тестовый сценарий 5*
Идентификатор: 1.3.5
Название: Создание директории
Описание: В случае, если все директории из путевого разбиения для
указанного ресурса существуют, то данный ресурс будет создан.
Красный случай
```python
assert_that(calling(client.info).with_args(remote_path), raises(RemoteParentNotFound))
```
Зеленый случай
```python
client.mkdir(remote_path)
assert_that(calling(client.check).with_args(remote_path), is_(success()))
```
*Тестовый сценарий 6*
Идентификатор: 1.3.6
Название: Удаление ресурса
Описание: В случае, если указанный ресурс существует и не является корнем, то
метод clean удалит данный ресурс.
Красный случай
```python
assert_that(calling(client.clean).with_args(remote_path), raises(RemoteResourceNotFound))
assert_that(calling(client.clean).with_args(root), raises(InvalidOption))
```
Зеленый случай
```python
client.clean(remote_path)
assert_that(calling(client.check).with_args(remote_path), is_(not_success()))
```
*Тестовый сценарий 7*
Идентификатор: 1.3.7
Название: Копирование ресурса
Описание: В случае, если указанный ресурс существует и не является корнем, то
метод copy копирует данный ресурс.
Красный случай
```python
assert_that(calling(client.copy).with_args(from_path=remote_path, to_path=new_path), raises(RemoteResourceNotFound))
assert_that(calling(client.copy).with_args(from_path=root, to_path=new_path), raises(InvalidOption))
assert_that(calling(client.copy).with_args(from_path=remote_path, to_path=root), raises(InvalidOption))
assert_that(calling(client.copy).with_args(from_path=remote_path, to_path=remote_path), is_not(raises(WebDavException)))
```
Зеленый случай
```python
client.copy(from_path=remote_path, to_path=new_path)
assert_that(calling(client.check).with_args(new_path), is_(success()))
```
*Тестовый сценарий 8*
Идентификатор: 1.3.8
Название: Перемещение ресурса
Описание: В случае, если указанный ресурс существует и не является корнем, то
метод move переместит данный ресурс.
Красный случай
```python
assert_that(calling(client.move).with_args(from_path=old_path, to_path=new_path), raises(RemoteResourceNotFound))
assert_that(calling(client.move).with_args(from_path=root, to_path=new_path), raises(InvalidOption))
assert_that(calling(client.move).with_args(from_path=old_path, to_path=root), raises(InvalidOption))
assert_that(calling(client.move).with_args(from_path=old_path, to_path=remote_path), is_not(raises(WebDavException)))
```
Зеленый случай
```python
client.move(from_path=old_path, to_path=new_path)
assert_that(calling(client.check).with_args(old_path), is_(not_success()))
assert_that(calling(client.check).with_args(new_path), is_(success()))
```
*Тестовый сценарий 9*
Идентификатор: 1.3.9
Название: Загрузка ресурса
Описание: В случае, если указанный ресурс существует,
то метод download загрузит данный ресурс.
Красный случай
```python
assert_that(calling(client.download).with_args(remote_path=remote_path, local_path=local_path), raises(LocalResourceNotFound))
assert_that(calling(client.download).with_args(remote_path=remote_path, local_path=local_path), raises(RemoteResourceNotFound))
assert_that(calling(client.download).with_args(remote_path=remote_file, local_path=local_directory), raises(InvalidOption))
assert_that(calling(client.download).with_args(remote_path=remote_directory, local_path=local_file), raises(InvalidOption))
```
Зеленый случай
```python
client.download(remote_path=remote_path, local_path=local_path)
assert_that(local_path, is_(exist()))
```
*Тестовый сценарий 10*
Идентификатор: 1.3.10
Название: Выгрузка ресурса
Описание: В случае, если родительская директория указанный ресурса
существует, то метод upload выгрузит файл или директорию в
ресурс.
Красный случай
```python
assert_that(calling(client.upload).with_args(remote_path=remote_path, local_path=local_path), raises(RemoteParentNotFound))
assert_that(calling(client.upload).with_args(remote_path=remote_file, local_path=local_directory), raises(InvalidOption))
assert_that(calling(client.upload).with_args(remote_path=remote_directory, local_path=local_file), raises(InvalidOption))
```
Зеленый случай
```python
client.upload(remote_path=remote_path, to_path=local_path)
assert_that(calling(client.check).with_args(remote_path), is_(success()))
```
*Тестовый сценарий 11*
Идентификатор: 1.3.11
Название: Публикация ресурса
Описание: В случае, если указанный ресурс существует, то метод publish
возвращает публичную ссылку на ресурс.
Красный случай
```python
assert_that(calling(client.publish).with_args(remote_path), raises(RemoteResourceNotFound))
```
Зеленый случай
```python
assert_that(calling(client.publish).with_args(remote_path), is_not(raises(RemoteResourceNotFound))
link = client.publish(remote_path)
assert_that(link, starts_with("http")
```
*Тестовый сценарий 12*
Идентификатор: 1.3.12
Название: Отмена публикации ресурса
Описание: В случае, если указанный ресурс существует,
то метод unpublish отменяет публикацию ресурса.
Красный случай
```python
assert_that(calling(client.unpublish).with_args(remote_path), raises(RemoteResourceNotFound))
```
Зеленый случай
```python
assert_that(calling(client.unpublish).with_args(remote_path), is_not(raises(RemoteResourceNotFound))
```
### resource API ###
Компонент resource API состоит из следующих тестовых наборов методы:
- получение ресурса
- методы
#### Получение ресурса ####
Для получение ресурса, используется метод `resource`.
*Тестовый сценарий 1*
Идентификатор: 2.1.1
Название: Получение ресурса
Описание: В случае, если указанный ресурс является директорией и существует,
то метод resource возвращает ресурс.
В случае, если указанный ресурс является файлом,
то метод resource возвращает ресурс.
Красный случай
```python
assert_that(calling(client.resource).with_args(remote_directory), raises(RemoteResourceNotFound))
assert_that(calling(client.resource).with_args(remote_file), is_not(raises(RemoteResourceNotFound)))
```
Зеленый случай
```python
assert_that(calling(client.check).with_args(remote_path), is_(success())
res = client.resource(remote_path)
assert_that(res.check())
```
#### Методы ####
resource API реализует следущие методы: `check`, `clean`, `is_directory`, `rename`, `move`, `copy`, `info`, `read_from`, `read`, `read_async`, `write_to`, `write`, `write_async`, `publish` и `unpublish`.
*Тестовый сценарий 1*
Идентификатор: 2.2.1
Название: Проверка существования ресурса
Описание: В случае, если указанный ресурс существует,
то результат метода check будет успешным.
Красный случай
```python
assert_that(calling(client.resource).with_args(remote_path), raises(RemoteResourceNotFound))
```
Зеленый случай
```python
assert_that(calling(client.check).with_args(remote_path), is_(success())
res = client.resource(remote_path)
assert_that(res.check())
```
*Тестовый сценарий 2*
Идентификатор: 2.2.2
Название: Удаление ресурса
Описание: В случае, если указанный ресурс существует,
то метод clean удалит данный ресурс.
Красный случай
```python
res = client.resource(remote_path)
assert_that(calling(res.clean), is_not(raises(RemoteResourceNotFound)))
```
Зеленый случай
```python
assert_that(calling(client.check).with_args(remote_path), is_(success())
res = client.resource(remote_path)
assert_that(res.check())
```
*Тестовый сценарий 3*
Идентификатор: 2.2.3
Название: Проверка является ли ресурс директорией
Описание: В случае, если указанный ресурс является директорией,
то результат метода is_directory будет успешным.
Красный случай
```python
res = client.resource(remote_file)
assert_that(calling(res.is_directory), is_(not_success()))
```
Зеленый случай
```python
res = client.resource(remote_directory)
assert_that(calling(res.is_directory), is_(success()))
```
*Тестовый сценарий 4*
Идентификатор: 2.2.4
Название: Переименование ресурса
Описание: В случае, если указанный ресурс существует,
то метод rename переименует данный ресурс.
Красный случай
```python
res = client.resource(remote_path)
assert_that(calling(res.rename).with_args(new_name), raises(RemoteResourceNotFound))
assert_that(calling(res.rename).with_args(new_name), raises(RemoteResourceAlreadyExists))
```
Зеленый случай
```python
res = client.resource(old_path)
res.rename(new_name)
new_path = res.urn
assert_that(calling(client.check).with_args(old_path), is_(not_success()))
assert_that(calling(client.check).with_args(new_path), is_(success()))
```
*Тестовый сценарий 5*
Идентификатор: 2.2.5
Название: Перемещение ресурса
Описание: В случае, если указанный ресурс существует,
то метод move переместит данный ресурс.
Красный случай
```python
res = client.resource(old_path)
assert_that(calling(res.move).with_args(new_path), raises(RemoteResourceNotFound))
```
Зеленый случай
```python
res = client.resource(old_path)
res.move(new_path)
assert_that(calling(client.check).with_args(old_path), is_(not_success()))
assert_that(calling(client.check).with_args(new_path), is_(success()))
```
*Тестовый сценарий 6*
Идентификатор: 2.2.6
Название: Копирование ресурса
Описание: В случае, если указанный ресурс существует,
то метод copy скопирует данный ресурс.
Красный случай
```python
res = client.resource(remote_path)
assert_that(calling(res.copy).with_args(to_path), raises(RemoteResourceNotFound))
```
Зеленый случай
```python
res = client.resource(remote_path)
res.copy(new_path)
assert_that(calling(client.check).with_args(remote_path), is_(success()))
assert_that(calling(client.check).with_args(new_path), is_(success()))
```
*Тестовый сценарий 7*
Идентификатор: 2.2.7
Название: Получение информации о ресурсе
Описание: В случае, если указанный ресурс существует,
то метод info возвращает информацию следующего типа:
- дата создания;
- дата модификации;
- размер;
- имя.
Красный случай
```python
res = client.resource(remote_path)
assert_that(calling(res.info), raises(RemoteResourceNotFound))
```
Зеленый случай
```python
res = client.resource(remote_path)
info = res.info()
assert_that(info, has_key("data1"))
assert_that(info, has_key("data2"))
assert_that(info, has_key("size"))
assert_that(info, has_key("name"))
```
*Тестовый сценарий 8*
Идентификатор: 2.2.8
Название: Считывание данных с буфера в ресурс
Описание: В случае, если указанный ресурс не является директорией,
то метод read_from считывет содержимое буфера и записывает в ресурс.
Красный случай
```python
res1 = client.resource(remote_file)
assert_that(buff, is_(empty))
assert_that(calling(res1.read_from).with_args(buff), raises(BufferIsEmpty))
res2 = client.resource(remote_directory)
assert_that(calling(res2.read_from).with_args(buff), raises(ResourceIsNotDirectory))
```
Зеленый случай
```python
res = client.resource(remote_path)
res.read_from(buff)
res_size = res.info("size")
assert_that(buff.size(), equal_to(res_size))
```
*Тестовый сценарий 9*
Идентификатор: 2.2.9
Название: Запись данных в буфер
Описание: В случае, если указанный ресурс не является директорией,
то метод write_to записывает содержимое ресурса в буфер.
Красный случай
```python
res = client.resource(remote_path)
assert_that(calling(res.write_to).with_args(buff), raises(RemoteResourceNotFound))
```
Зеленый случай
```python
res = client.resource(remote_path)
res.write_to(buff)
res_size = res.info("size")
assert_that(buff.size(), equal_to(res_size))
```
*Тестовый сценарий 10*
Идентификатор: 2.2.10
Название: Публикация ресурса
Описание: В случае, если указанный ресурс существует, то метод publish
возвращает публичную ссылку на ресурс.
Красный случай
```python
res = client.resource(remote_path)
assert_that(calling(res.publish), raises(RemoteResourceNotFound))
```
Зеленый случай
```python
res = client.resource(remote_path)
assert_that(calling(res.publish), is_not(raises(RemoteResourceNotFound))
link = res.publish()
assert_that(link, starts_with("http")
```
*Тестовый сценарий 11*
Идентификатор: 2.2.11
Название: Отмена публикации ресурса
Описание: В случае, если указанный ресурс существует,
то метод unpublish отменяет публикацию ресурса.
Красный случай
```python
res = client.resource(remote_path)
assert_that(calling(res.unpublish), raises(RemoteResourceNotFound))
```
Зеленый случай
```python
res = client.resource(remote_path)
assert_that(calling(res.unpublish).with_args(remote_path), is_not(raises(RemoteResourceNotFound))
```