Skip to content
This repository has been archived by the owner on Nov 3, 2019. It is now read-only.

Commit

Permalink
Merge pull request #12 from passuf/feature/subtasks
Browse files Browse the repository at this point in the history
Handle completed Subtasks fixes #10
  • Loading branch information
passuf committed Jan 10, 2016
2 parents b299519 + 7d8b9ac commit 910675a
Show file tree
Hide file tree
Showing 11 changed files with 324 additions and 32 deletions.
17 changes: 12 additions & 5 deletions wh_habitica/factories.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
import factory
from django.contrib.auth import get_user_model

from django.utils.crypto import get_random_string

class UserFactory(factory.django.DjangoModelFactory):
from .models import Habitica
from wunderhabit.factories import UserFactory


class HabiticaFactory(factory.django.DjangoModelFactory):
class Meta:
model = get_user_model()
model = Habitica

first_name = 'John'
last_name = 'Doe'
user_id = factory.Sequence(lambda n: "%d" % n)
name = 'John'
email = 'john@doe.com'
api_token = get_random_string(32)
owner = factory.SubFactory(UserFactory)
3 changes: 0 additions & 3 deletions wh_habitica/tests.py

This file was deleted.

Empty file added wh_habitica/tests/__init__.py
Empty file.
6 changes: 3 additions & 3 deletions wh_habitica/test_forms.py → wh_habitica/tests/test_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import pytest
import responses

import default
from .factories import UserFactory
from .forms import AuthForm
from wh_habitica import default
from wh_habitica.forms import AuthForm
from wunderhabit.factories import UserFactory

USER_DICT = dict(username='tester', email='foo@bar.com')

Expand Down
11 changes: 11 additions & 0 deletions wunderhabit/factories.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import factory
from django.contrib.auth import get_user_model


class UserFactory(factory.django.DjangoModelFactory):
class Meta:
model = get_user_model()

username = factory.Sequence(lambda n: "user_%d" % n)
first_name = 'John'
last_name = 'Doe'
1 change: 1 addition & 0 deletions wunderlist/default.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,5 @@
OPERATION_UPDATE = 'update'

SUBJECT_TASK = 'task'
SUBJECT_SUBTASK = 'subtask'
SUBJECT_LIST = 'list'
25 changes: 25 additions & 0 deletions wunderlist/factories.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import factory

from django.utils.crypto import get_random_string

from .models import Connection, Wunderlist
from wunderhabit.factories import UserFactory


class WunderlistFactory(factory.django.DjangoModelFactory):
class Meta:
model = Wunderlist

user_id = factory.Sequence(lambda n: "%d" % n)
name = 'John'
email = 'john@doe.com'
api_token = get_random_string(32)
owner = factory.SubFactory(UserFactory)


class ConnectionFactory(factory.django.DjangoModelFactory):
class Meta:
model = Connection

list_id = 42
token = get_random_string(32)
3 changes: 0 additions & 3 deletions wunderlist/tests.py

This file was deleted.

Empty file added wunderlist/tests/__init__.py
Empty file.
249 changes: 249 additions & 0 deletions wunderlist/tests/test_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,249 @@
import json
import pytest
from requests import HTTPError
from django.core.urlresolvers import reverse
from django.http import Http404

from wunderlist import default
from wunderlist.factories import WunderlistFactory, ConnectionFactory
from wunderlist.views import webhook
from wh_habitica.factories import HabiticaFactory


USER_DICT = dict(username='tester', email='foo@bar.com')
INVALID_HOOK_TOKEN = '0000aUZ01eJYBhsIIVZotvc0dY9h0000'


def get_user():
"""
Returns a user which is connected with wunderlist and habitica.
"""
wunderlist = WunderlistFactory.create()
habitica = HabiticaFactory.create()
habitica.owner = wunderlist.owner
habitica.save()
return wunderlist.owner


def get_invalid_webhook_body():
return {
default.JSON_OPERATION: default.OPERATION_CREATE,
'no_user_id': -1,
default.JSON_SUBJECT: {
'no_type': 'type missing'
},
}


def get_valid_webhook_body(
op=default.OPERATION_UPDATE,
user_id=-1,
subject_type=default.SUBJECT_TASK,
completed_before=False,
completed_after=True,
):
return {
default.JSON_OPERATION: op,
default.JSON_USER_ID: user_id,
default.JSON_SUBJECT: {
default.JSON_TYPE: subject_type
},
default.JSON_BEFORE: {
default.JSON_COMPLETED: completed_before,
},
default.JSON_AFTER: {
default.JSON_COMPLETED: completed_after,
},
}


@pytest.mark.django_db
def test_webhook_invalid_token(rf):
request = rf.post(reverse('wunderlist:webhook', kwargs={'hook_id': INVALID_HOOK_TOKEN}))
with pytest.raises(Http404):
response = webhook(request, hook_id=INVALID_HOOK_TOKEN)


@pytest.mark.django_db
def test_webhook_invalid_request_type(rf):
connection = ConnectionFactory.create()
request = rf.get(reverse('wunderlist:webhook', kwargs={'hook_id': connection.token}))
response = webhook(request, hook_id=connection.token)
assert response.status_code == 400


@pytest.mark.django_db
def test_webhook_invalid_request_body(rf):
owner = get_user()
connection = ConnectionFactory.create()
connection.owner = owner
connection.save()

post_data = get_invalid_webhook_body()
request = rf.post(
reverse('wunderlist:webhook', kwargs={'hook_id': connection.token}),
json.dumps(post_data),
content_type="application/json",
)
response = webhook(request, hook_id=connection.token)
assert response.status_code == 400


@pytest.mark.django_db
def test_webhook_inactive_connection(rf):
owner = get_user()
connection = ConnectionFactory.create()
connection.owner = owner
connection.is_active = False
connection.save()

post_data = get_valid_webhook_body()
request = rf.post(
reverse('wunderlist:webhook', kwargs={'hook_id': connection.token}),
json.dumps(post_data),
content_type="application/json",
)
response = webhook(request, hook_id=connection.token)
assert response.status_code == 410


@pytest.mark.django_db
def test_webhook_invalid_wunderlist_user(rf):
owner = get_user()
connection = ConnectionFactory.create()
connection.owner = owner
connection.save()

post_data = get_valid_webhook_body(user_id=-1)
request = rf.post(
reverse('wunderlist:webhook', kwargs={'hook_id': connection.token}),
json.dumps(post_data),
content_type="application/json",
)
response = webhook(request, hook_id=connection.token)
assert response.status_code == 401


@pytest.mark.django_db
def test_webhook_wrong_user(rf):
owner = get_user()
wrong_user = get_user()
connection = ConnectionFactory.create()
connection.owner = wrong_user
connection.save()

post_data = get_valid_webhook_body(user_id=owner.wunderlist.user_id)
request = rf.post(
reverse('wunderlist:webhook', kwargs={'hook_id': connection.token}),
json.dumps(post_data),
content_type="application/json",
)
response = webhook(request, hook_id=connection.token)
assert response.status_code == 401


@pytest.mark.django_db
def test_webhook_inactive_user(rf):
owner = get_user()
connection = ConnectionFactory.create()
connection.owner = owner
connection.save()
owner.is_active = False
owner.save()

post_data = get_valid_webhook_body(user_id=owner.wunderlist.user_id)
request = rf.post(
reverse('wunderlist:webhook', kwargs={'hook_id': connection.token}),
json.dumps(post_data),
content_type="application/json",
)
response = webhook(request, hook_id=connection.token)
assert response.status_code == 403


@pytest.mark.django_db
def test_webhook_task_completed(rf):
owner = get_user()
connection = ConnectionFactory.create()
connection.owner = owner
connection.save()

post_data = get_valid_webhook_body(user_id=owner.wunderlist.user_id)
request = rf.post(
reverse('wunderlist:webhook', kwargs={'hook_id': connection.token}),
json.dumps(post_data),
content_type="application/json",
)
with pytest.raises(HTTPError) as error:
response = webhook(request, hook_id=connection.token)
assert 'Unauthorized' in str(error.value)


@pytest.mark.django_db
def test_webhook_subtask_completed(rf):
owner = get_user()
connection = ConnectionFactory.create()
connection.owner = owner
connection.save()

post_data = get_valid_webhook_body(user_id=owner.wunderlist.user_id, subject_type=default.SUBJECT_SUBTASK)
request = rf.post(
reverse('wunderlist:webhook', kwargs={'hook_id': connection.token}),
json.dumps(post_data),
content_type="application/json",
)
with pytest.raises(HTTPError) as error:
response = webhook(request, hook_id=connection.token)
assert 'Unauthorized' in str(error.value)


@pytest.mark.django_db
def test_webhook_invalid_task_body(rf):
owner = get_user()
connection = ConnectionFactory.create()
connection.owner = owner
connection.save()

post_data = get_valid_webhook_body(user_id=owner.wunderlist.user_id)
del post_data[default.JSON_AFTER]
request = rf.post(
reverse('wunderlist:webhook', kwargs={'hook_id': connection.token}),
json.dumps(post_data),
content_type="application/json",
)
response = webhook(request, hook_id=connection.token)
assert response.status_code == 400


@pytest.mark.django_db
def test_webhook_task_created(rf):
owner = get_user()
connection = ConnectionFactory.create()
connection.owner = owner
connection.save()

post_data = get_valid_webhook_body(user_id=owner.wunderlist.user_id, op=default.OPERATION_CREATE)
request = rf.post(
reverse('wunderlist:webhook', kwargs={'hook_id': connection.token}),
json.dumps(post_data),
content_type="application/json",
)
response = webhook(request, hook_id=connection.token)
assert response.status_code == 200


@pytest.mark.django_db
def test_webhook_unknown_operation(rf):
owner = get_user()
connection = ConnectionFactory.create()
connection.owner = owner
connection.save()

post_data = get_valid_webhook_body(user_id=owner.wunderlist.user_id, op='op_unknown')
request = rf.post(
reverse('wunderlist:webhook', kwargs={'hook_id': connection.token}),
json.dumps(post_data),
content_type="application/json",
)
response = webhook(request, hook_id=connection.token)
assert response.status_code == 400
Loading

0 comments on commit 910675a

Please sign in to comment.