class BackOfficeBackend(TestCase):
    def setUp(self):
        user, created = User.objects.get_or_create(username='******',
                                                   password='******',
                                                   first_name='Admin',
                                                   last_name='User',
                                                   email='*****@*****.**',
                                                   is_active=True,
                                                   is_staff=True,
                                                   is_superuser=True)
        user.set_password('admin')
        user.save()

        self.user2, created2 = User.objects.get_or_create(username='******',
                                                     password='******',
                                                     first_name='Admin2',
                                                     last_name='User',
                                                     email='*****@*****.**',
                                                     is_active=True,
                                                     is_staff=True,
                                                     is_superuser=True)
        self.user2.set_password('admin')
        self.user2.save()

        self.home_url = reverse(test_backoffice.name + ':home', current_app=test_backoffice.app_name)
        self.client = Client()
        self.client.post(self.home_url, {'username': '******', 'password': '******'})

    def _reverse(self, name, args=None, kwargs=None):
        pass

    def test_default_context(self):
        """The default context contains usable values"""
        context = test_backoffice.default_context()
        self.assertEqual(context['backoffice'], test_backoffice)
        self.assertTrue('api_url' in context)
        self.assertTrue('root_url' in context)

    def test_home_view(self):
        response = self.client.get(self.home_url)
        self.assertEqual(response.status_code, 200)
        self.assertIn('Hi, <strong>Admin</strong>', response.content)

    def test_default_define_urls(self):
        self.assertEqual(BackOfficeBase().define_urls(), ())

    def test_login_as(self):
        self.client.get(self.home_url + 'login/as/' + six.text_type(self.user2.pk) + '/')
        response = self.client.get(self.home_url, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertIn('Hi, <strong>Admin2</strong>', response.content)
        response = self.client.get(self.home_url + 'end/login/as/', follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertIn('Hi, <strong>Admin</strong>', response.content)
        self.client.get(self.home_url + 'end/login/as/')

    def test_logout(self):
        response = self.client.get(self.home_url + 'logout/')
        self.assertEqual(response.status_code, 200)
        self.assertNotIn('Hi,', response.content)
Example #2
0
    def test_password_reset(self):
        """
        Tests the forgotten/reset password workflow.
        """

        c = Client()

        resp = c.get(reverse('password_reset'))
        self.assertTrue(resp.status_code, 200)

        resp = c.post(reverse('password_reset'), data={'email': '*****@*****.**'})
        self.assertEqual(resp.status_code, 302)

        self.assertEqual(len(mail.outbox), 1)

        token = resp.context[0]['token']
        uid = resp.context[0]['uid']

        # Grab the token and uidb64 so that we can hit the reset url
        resp = c.get(reverse('password_reset_confirm', kwargs={'token': token, 'uidb64': uid}))
        self.assertEqual(resp.status_code, 200)
        self.assertTrue(resp.template_name.endswith('password_reset_confirm.html'))

        resp = c.post(reverse('password_reset_confirm', kwargs={'token': token, 'uidb64': uid}),
                      {'new_password1': 'mynewpassword', 'new_password2': 'mynewpassword'})
        self.assertEqual(resp.status_code, 302)
        self.assertEqual(resolve(urlsplit(resp.url).path).url_name, 'password_reset_complete')

        resp = c.post(reverse('login'), {'username': '******', 'password': '******'})

        # User is returned to the login page on error vs redirected by default
        self.assertEqual(resp.status_code, 302)
        self.assertNotEqual(resolve(urlsplit(resp.url).path).url_name, 'login')
Example #3
0
class WebhooksPOST_TestCase(TestCase):

    def setUp(self):
        self.client = Client()
        factories.models.User.update_friends = Mock()

    def tearDown(self):
        factories.models.User.update_friends = origin_update_friends

    def _get_body(self, obj='user', entry={'id': -1}):
        return dumps({
            'object': obj,
            'entry': [entry]
        })

    def _get_signature(self, body):
        key = settings.SOCIAL_AUTH_FACEBOOK_SECRET
        return "sha1={}".format(hmac.new(key, body, sha1).hexdigest())

    def test_update_ok(self):
        user = factories.UsersFactory.create()
        body = self._get_body(entry={'id': user.uid})

        signature = self._get_signature(body)

        url = reverse('webhooks', )
        response = self.client.post(url, body,
                                    content_type="application/json",
                                    **{'HTTP_X_HUB_SIGNATURE': signature})
        self.assertEqual(response.content, 'Ok')
        self.assertEqual(response.status_code, 200)
        self.assertTrue(user.update_friends.called)

    def test_update_fails_with_wrong_body(self):
        body = self._get_body(obj='wrong object')
        url = reverse('webhooks', )
        response = self.client.post(url, body, content_type="application/json")
        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.content, 'Invalid webhook')

    def test_update_fails_with_wrong_uid(self):
        body = self._get_body()
        url = reverse('webhooks', )
        signature = self._get_signature(body)
        response = self.client.post(url, body,
                                    content_type="application/json",
                                    **{'HTTP_X_HUB_SIGNATURE': signature})
        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.content, 'Invalid user id')

    def test_update_fails_with_wrong_signature(self):
        user = factories.UsersFactory.create()
        body = self._get_body(entry={'id': user.uid})
        url = reverse('webhooks', )
        response = self.client.post(url, body,
                                    content_type="application/json",
                                    **{'HTTP_X_HUB_SIGNATURE': 'sha1=invalid'})
        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.content, 'Invalid signature')
        self.assertFalse(user.update_friends.called)
class TestAssignmentUploadForm(TestCase):
    def upload_test(self):
        self.client = Client()
        self.username = '******'
        self.email = '*****@*****.**'
        self.password = '******'
        self.test_user = User.objects.create_user(self.username, self.email, self.password)
        login = self.client.login(username=self.username, password=self.password)
        self.assertEqual(login, True)
        course = Course.objects.create(number='1234', name='Test course')
        student = Student.objects.create(
            user=User.objects.create_user('test_user', first_name='Student'),
            course=course,
        )
        staff = Staff.objects.create(
            user=User.objects.create_user('test_staff', first_name='Staff')
        )
        subject = Subject.objects.create(course=course, name='Subject1', staff=staff)
        assignment = Assignment.objects.create(subject=subject, topic='This is Enemy', deadline=timezone.now(),
                                               description="I need holiday..")
        with open('requirements.txt') as fp:
            self.client.post('/assignments/' + assignment.pk + '/upload/',
                             {'assignment': assignment, 'user': student.user, 'created': timezone.now(), 'file': fp})
        response = self.client.get(reverse('assignment_detail', args=(assignment.pk,)))
        print(response.status_code)
        self.assertContains(response, assignment.topic)
        self.assertContains(response, 'requirements.txt')
        self.assertEqual(response.status_code, 200)
Example #5
0
 def test_post_user_check_result_false(self):
     client = Client()
     client.post(
         '/users_check/', {'id_user_1': 123, 'id_user_2': 3}
     )
     self.assertEqual('res' in client._session().keys(), True)
     self.assertEqual(False in client._session().values(), True)
class TestURNSubmissionFailureMessage(TestCase):
    def setUp(self):
        self.court = Court.objects.create(
            court_code="0000",
            region_code="06",
            court_name="test court",
            court_address="test address",
            court_telephone="0800 MAKEAPLEA",
            court_email="*****@*****.**",
            submission_email="*****@*****.**",
            plp_email="*****@*****.**",
            enabled=True,
            display_case_data=True,
            validate_urn=True,
            test_mode=False)

        self.case = Case.objects.create(
            urn="06YY0000000",
            imported=True
        )

        self.client = Client()

    def test_single_failure_no_message(self):
        response = self.client.post('/plea/enter_urn/', data=dict(urn="06xx0000000"))

        self.assertContains(response, "You need to fix the errors on this page before continuing.")
        self.assertNotContains(response, "Your reference number has not been recognised")

    def test_message_appears_after_multiple_failures(self):

        for i in range(3):
            response = self.client.post('/plea/enter_urn/', data=dict(urn="06xx0000000"))

        self.assertContains(response, "Your reference number has not been recognised")
Example #7
0
    def test_activate(self):
        c = Client()

        response = c.get('/signup/activate/')
        self.assertEqual(response.status_code, 200)

        response = c.post('/signup/activate/', {'ps1_email': '*****@*****.**'}, follow=True)
        self.assertEqual(response.status_code, 200)

        # "read" email
        token = self.get_token()
        activation_url = '/signup/activate/confirm/{}'.format(token.token)
        response = c.get(activation_url)
        self.assertEqual(response.status_code, 200)
        
        post_data = {
            'preferred_username': '******',
            'first_name': 'Jay',
            'last_name': 'Hacker',
            'preferred_email': '*****@*****.**',
            'token': token.token,
        }
        response = c.post(activation_url, post_data, follow=True)
        self.assertEqual(response.status_code, 200)

        jay = Person.objects.get(pk=self.person.pk)
        self.assertIsNotNone(jay.user)
        PS1User.objects.delete_user(jay.user)
Example #8
0
class LoginTest(SimpleTestCase):
    user = '******'
    pwd = '123456'

    def setUp(self):
        self.client = Client()
        if not User.objects.filter(username=self.user).first():
            User.objects.create_user(username=self.user, password=self.pwd)

    def test_200ok(self):
        self.assertEqual(self.client.get('/login/').status_code, 200)
        self.assertEqual(self.client.post('/login/').status_code, 200)

    def test_login_normal(self):
        self.assertTrue(self.client.login(username=self.user, password=self.pwd))

        self.client.logout()
        res = self.client.post(path='/login/', data={'username': self.user, 'password': self.pwd})
        self.assertEqual(res.url, 'http://testserver/index.html')

    def test_login_nextpage(self):
        res = self.client.post(path='/login/', data={'username': self.user, 'password': self.pwd, 'next': '/404/'})
        self.assertEqual(res.status_code, 302)

    def test_logout(self):
        self.assertIsNone(self.client.logout())

        self.client.login(username=self.user, password=self.pwd)
        self.assertIsNone(self.client.logout())
class BasicAuthTests(TestCase):
    """Basic authentication"""
    urls = 'rest_framework.tests.authentication'

    def setUp(self):
        self.csrf_client = Client(enforce_csrf_checks=True)
        self.username = '******'
        self.email = '*****@*****.**'
        self.password = '******'
        self.user = User.objects.create_user(self.username, self.email, self.password)

    def test_post_form_passing_basic_auth(self):
        """Ensure POSTing json over basic auth with correct credentials passes and does not require CSRF"""
        auth = 'Basic %s' % base64.encodestring('%s:%s' % (self.username, self.password)).strip()
        response = self.csrf_client.post('/basic/', {'example': 'example'}, HTTP_AUTHORIZATION=auth)
        self.assertEqual(response.status_code, 200)

    def test_post_json_passing_basic_auth(self):
        """Ensure POSTing form over basic auth with correct credentials passes and does not require CSRF"""
        auth = 'Basic %s' % base64.encodestring('%s:%s' % (self.username, self.password)).strip()
        response = self.csrf_client.post('/basic/', json.dumps({'example': 'example'}), 'application/json', HTTP_AUTHORIZATION=auth)
        self.assertEqual(response.status_code, 200)

    def test_post_form_failing_basic_auth(self):
        """Ensure POSTing form over basic auth without correct credentials fails"""
        response = self.csrf_client.post('/basic/', {'example': 'example'})
        self.assertEqual(response.status_code, 401)

    def test_post_json_failing_basic_auth(self):
        """Ensure POSTing json over basic auth without correct credentials fails"""
        response = self.csrf_client.post('/basic/', json.dumps({'example': 'example'}), 'application/json')
        self.assertEqual(response.status_code, 401)
        self.assertEqual(response['WWW-Authenticate'], 'Basic realm="api"')
Example #10
0
class TestUpdateUserPerms(TransactionTestCase):
    def setUp(self):
        self.client = Client()
        self.user = User.objects.create_user(username='******', password='******',
                                             first_name='Hodor', last_name='HodorHodor',
                                             email='*****@*****.**')
        Perms.objects.create(user=self.user, access_level=1).save()

    def test_update_user_perms(self):
        """Updating user permissions"""
        self.client.login(username='******', password='******')
        new_user = User.objects.create_user(username='******', password='******',
                                            first_name='Phillip', last_name='J Fry',
                                            email='*****@*****.**')

        #Test if perms are created for new user
        response = self.client.post('/users/perms/update/', data={'user_id': new_user.id, 'access_level': '5'}, follow=True)
        self.assertRedirects(response, '/users/view/%d/' % new_user.id)
        user = User.objects.get(pk=new_user.id)
        self.assertEquals(user.perms.access_level, 5)

        # Test updating once you have perms
        response = self.client.post('/users/perms/update/', data={'user_id': new_user.id, 'access_level': '2'}, follow=True)
        self.assertRedirects(response, '/users/view/%d/' % new_user.id)
        user = User.objects.get(pk=new_user.id)
        self.assertEquals(user.perms.access_level, 2)
Example #11
0
    def test_upload(self):
        """Can we create an image on the filestore?"""
        username, user = _make_user()
        c = Client()

        with open(UPLOAD_FILE) as photo_fd:
            response = c.post("/umedia/", {
                    "title": "a picture of me I just took",
                    "photo": photo_fd
                    })
            self.assertEquals(302, response.status_code)
            parsed = urlparse.urlparse(response["Location"])
            self.assertEquals(parsed.path, settings.LOGIN_URL)

        # Now login
        loggedin = c.login(username=username, password="******")
        self.assertTrue(loggedin)
        with open(UPLOAD_FILE) as photo_fd:
            response = c.post("/umedia/", {
                    "title": "a picture of me I just took",
                    "photo": photo_fd
                    })
            self.assertEquals(201, response.status_code)

            # What's the url
            parsed = urlparse.urlparse(response["Location"])

            # Check we've got the correct file type
            self.assertEquals(os.path.splitext(parsed.path)[1][1:], "jpg")
            
            # Check that is starts with something under the MEDIA_DOMAIN
            self.assertEquals(
                settings.MEDIA_DOMAIN, 
                ".".join(parsed.netloc.split(".")[2:])
                )
Example #12
0
class AlarmViewTest(TestCase):

    def setUp(self):
        self.client = Client()
        self.user = PyDayUser.objects._create_user("*****@*****.**", "secret",
                                                   "MynameisWhat",
                                                   "MynameisWho")
        self.client.login(email='*****@*****.**', password='******')

    def test_get(self):
        with self.assertTemplateUsed("create_alarm.html"):
            self.client.get(reverse("pyday_alarms:alarms"))

    def test_post(self):
        with self.assertTemplateUsed("error.html"):
            response = self.client.post(reverse("pyday_alarms:alarms"),
                                        {'date': '07/01/2016', 'hour': '1',
                                         'mins': '0', 'message': 'haha'},
                                        follow=True)
            self.assertContains(response, "Raspberry!")

    def test_post_invalid_form(self):
        with self.assertTemplateUsed("error.html"):
            response = self.client.post(reverse("pyday_alarms:alarms"), {})
            self.assertContains(response, "Invalid form")
Example #13
0
class TestContentParsingWithAuthentication(TestCase):
    urls = "djangorestframework.tests.content"

    def setUp(self):
        self.csrf_client = Client(enforce_csrf_checks=True)
        self.username = "******"
        self.email = "*****@*****.**"
        self.password = "******"
        self.user = User.objects.create_user(self.username, self.email, self.password)
        self.req = RequestFactory()

    def test_user_logged_in_authentication_has_post_when_not_logged_in(self):
        """Ensures request.POST exists after UserLoggedInAuthentication when user doesn't log in"""
        content = {"example": "example"}

        response = self.client.post("/", content)
        self.assertEqual(status.OK, response.status_code, "POST data is malformed")

        response = self.csrf_client.post("/", content)
        self.assertEqual(status.OK, response.status_code, "POST data is malformed")

    def test_user_logged_in_authentication_has_post_when_logged_in(self):
        """Ensures request.POST exists after UserLoggedInAuthentication when user does log in"""
        self.client.login(username="******", password="******")
        self.csrf_client.login(username="******", password="******")
        content = {"example": "example"}

        response = self.client.post("/", content)
        self.assertEqual(status.OK, response.status_code, "POST data is malformed")

        response = self.csrf_client.post("/", content)
        self.assertEqual(status.OK, response.status_code, "POST data is malformed")
Example #14
0
class ChangePasswordTestCase(TestCase):
    def setUp(self):
        self.my_user = User.objects.get(id=3)
        self.client = Client()

    def tearDown(self):
        self.my_user = None
        self.client = None

    def sign_in_first(self):
        return self.client.login(username=self.my_user.username, password="******")

    def test_user_should_login_first(self):
        # 'old_password', 'new_password1', 'new_password2'
        resp = self.client.post('/changepassword/', {'old_password': '******',
                                                     'new_password1': 'test',
                                                     'new_password2': 'test'})
        self.assertEqual(resp.status_code, 302, "The user is redirected because he is not logged in")
        self.assertRedirects(resp, "/signin/?next=/changepassword/")

    def test_if_password_changed_user_redirected_to_profile(self):
        self.sign_in_first()
        resp = self.client.post('/changepassword/', {'old_password': '******',
                                                     'new_password1': 'test',
                                                     'new_password2': 'test'})
        login_successful = self.client.login(username=self.my_user.username, password="******")
        self.assertTrue(login_successful)
        self.assertEqual(resp.status_code, 302)
        self.assertRedirects(resp, '/profile/')

    def test_password_form_sent_through_get_method(self):
        self.sign_in_first()
        resp = self.client.get('/changepassword/')
        self.assertEqual(resp.status_code, 200)
        self.assertTemplateUsed("changepassword.html")
Example #15
0
class EditProfileTestCase(TestCase):
    def setUp(self):
        self.my_user = User.objects.get(id=3)
        self.client = Client()

    def tearDown(self):
        self.my_user = None
        self.client = None

    def sign_in_first(self):
        return self.client.login(username=self.my_user.username, password="******")

    def test_user_redirected_to_profile_if_email_valid(self):
        self.sign_in_first()
        resp = self.client.post("/editprofile/", {'email': '*****@*****.**'})
        self.assertEqual(User.objects.get(id=3).email, '*****@*****.**')
        self.assertRedirects(resp, '/profile/')

    def test_error_redirected_to_edit_if_email_invalid(self):
        self.sign_in_first()
        resp = self.client.post("/editprofile/", {'email': 'skitest.fi'})
        self.assertNotEqual(User.objects.get(id=3).email, 'skitest.fi')
        self.assertFormError(resp, 'form', 'email', "Enter a valid email address.")
        self.assertTemplateUsed(resp, 'editprofile.html')

    def test_form_sent_in_response_to_get_request(self):
        self.sign_in_first()
        resp = self.client.post("/editprofile/")
        self.assertEqual(resp.status_code, 200)
        self.assertTemplateUsed("editprofile.html")
Example #16
0
 def test_user_agent(self):
     """Test the user agent."""
     client = Client()
     client.post('/with_user_agent', HTTP_USER_AGENT='Some User Agent')
     all_visitors = Visitor.objects.all()
     self.assertEqual(len(all_visitors), 1)
     self.assertEqual(all_visitors[0].user_agent, 'Some User Agent')
Example #17
0
class MontlyEventViewTest(TestCase):

    def setUp(self):
        self.client = Client()
        self.user = PyDayUser.objects._create_user("*****@*****.**", "secret",
                                                   "MynameisWhat",
                                                   "MynameisWho")

    def test_get_not_logged(self):
        response = self.client.get(reverse("pyday_calendar:monthly_events"),
                                   follow=True)
        self.assertEqual(response.redirect_chain,
                         [('/social/register/?next=/calendar/monthly_events/', 302)])

    def test_get_logged(self):
        self.client.login(email='*****@*****.**', password='******')
        with self.assertTemplateUsed("monthly_event.html"):
            resp = self.client.get(reverse("pyday_calendar:monthly_events"))
            self.assertEqual(resp.status_code, 200)

    def test_post_wrong_date(self):
        self.client.login(email='*****@*****.**', password='******')
        with self.assertTemplateUsed("error.html"):
            self.client.post(reverse("pyday_calendar:monthly_events"), {
                             "date": "60/2016"})

    def test_post_right_date(self):
        self.client.login(email='*****@*****.**', password='******')
        with self.assertTemplateUsed("monthly_event.html"):
            self.client.post(reverse("pyday_calendar:monthly_events"), {
                             "date": "6/2016"})
Example #18
0
    def test_vote_api(self):
        test_thread_1 = Discussion.objects.create(
            title='This1',
            username='******',
            description='the other thing',
        )

        comment = Comment.objects.create(
            discussion=test_thread_1,
            text='parent',
            username='******',
            score=0,
        )

        upvote = {
            "direction": "up",
            "comment_id": str(comment.id)
        }
        client = Client()
        client.post(reverse('vote_comment', kwargs=upvote))

        # Refresh comment from the database
        comment = Comment.objects.get(id=comment.id)

        self.assertEqual(comment.score, 1)

        downvote = {
            "direction": "down",
            "comment_id": str(comment.id)
        }
        client.post(reverse('vote_comment', kwargs=downvote))
        comment = Comment.objects.get(id=comment.id)

        self.assertEqual(comment.score, 0)
Example #19
0
 def test_ip_address(self):
     """Test the ip address."""
     client = Client()
     client.post('/with_ip', REMOTE_ADDR='10.10.10.10')
     all_visitors = Visitor.objects.all()
     self.assertEqual(len(all_visitors), 1)
     self.assertEqual(all_visitors[0].ip_address, '10.10.10.10')
Example #20
0
class ArticleTest(TestCase):
    def setUp(self):
        self.client = Client()
        self.factory = RequestFactory()

    def test_validate_article_edition(self):
        user2 = User.objects.create_user(username="******",
                                         email="*****@*****.**",
                                         password="******")

        article = Article()
        article.title = "nicetitle"
        article.content = "nicecontent"
        article.create_user = user2
        article.create_user.id = user2.id
        article.save()
        self.client.login(username="******", password="******")
        response = self.client.get(reverse('edit_article', kwargs={'id': '1'}))
        self.assertEqual(response.status_code, 302)
        response = self.client.post(reverse('edit_article',
                                            kwargs={'id': '1'}))
        self.assertEqual(response.status_code, 302)
        self.client.login(username="******", password="******")
        response = self.client.get(reverse('edit_article', kwargs={'id': '1'}),
                                   user=user2)
        self.assertEqual(response.status_code, 200)
        response = self.client.post(reverse('edit_article',
                                            kwargs={'id': '1'}))
        self.assertEqual(response.status_code, 200)
Example #21
0
    def test_edit_item(self):
        timestamp = datetime.now()
        description = 'Coke'
        caffeine = 50
        c = Client()
        c.login(username='******', password='******')
        response = c.post('/record/item', {
            'time': self.timestamp,
            'description': self.description,
            'caffeine': self.caffeine,
        })

        response = c.post('/edit/item?id=1', {
            'time': timestamp,
            'description': description,
            'caffeine': caffeine,
        })
        self.assertEqual(response.status_code, 303)
        record = Record.objects.get(pk=1)
        self.assertEqual(record.time, timestamp)
        self.assertEqual(record.caffeine, caffeine)
        self.assertEqual(record.description, description)

        response = c.post('/edit/item?id=2', {
            'time': timestamp,
            'description': description,
            'caffeine': caffeine,
        })
        self.assertEqual(response.status_code, 404)
Example #22
0
class RegisterUser(TestCase):
    """Test for 200 OK at '/'"""

    def setUp(self):
        self.client = Client()
        self.username = fake.user_name()
        self.password = fake.password()
        self.email = fake.email()

    def test_register_user(self):
        response = self.client.post(
            "/register/",
            {"username": self.username, "password1": self.password, "password2": self.password, "email": self.email},
            follow=True,
        )
        self.assertEqual(response.status_code, 200)
        self.assertIn("activate", response.content)

    def test_activate(self):
        register = self.client.post(
            "/register/",
            {"username": self.username, "password1": self.password, "password2": self.password, "email": self.email},
            follow=True,
        )
        # Regex lifted from:
        # http://stackoverflow.com/questions/9760588/how-do-you-extract-a-url-from-a-string-using-python
        link = re.search("(?P<url>https?://[^\s]+)", mail.outbox[0].body).group("url")
        link_bits = link.split("/")
        rel_uri = "/" + "/".join(link_bits[3:])
        activate = self.client.get(rel_uri, follow=True)
        self.assertIn("activate/complete", activate.wsgi_request.path)
        # Newly registered user now attempts to login
        logginin = self.client.post("/login/", {"username": self.username, "password": self.password}, follow=True)
        self.assertIn(self.username, logginin.content)
Example #23
0
class TestGeneTable(TestCase):
    def setUp(self):
        args = []
        opts = {'dumpfile': 'test_db_dump.xml', 'verbosity': 0}
        cmd = 'migrate_db'
        call_command(cmd, *args, **opts)
        self.client = Client()

    def test_view_index(self):
        response = self.client.get('/create_gene_table/')
        self.assertEqual(200, response.status_code)

    def test_results(self):
        expected = 'COI,mitochondrial,1047,58.357,42.0,0.0,58.0,17.299999999999997,22.5,9.5,9.1'
        response = self.client.post('/create_gene_table/results/',
                                    {
                                        'taxonset': 1,
                                        'geneset': 1,
                                        'translations': False,
                                    })
        self.assertTrue(expected in str(response.content))

    def test_results_invalid_form(self):
        response = self.client.post('/create_gene_table/results/', {
            'taxonset': 1000,
            'geneset': 1000,
            'translations': False,
        })
        expected = 'Erebia'
        self.assertTrue(expected in str(response.content))
class QuestionMethodTests(TestCase):
    def setUp(self):
        first_name = "Joe"
        second_name = "Man"
        email = "*****@*****.**"
        password = "******"

        self.user = User(first_name=first_name, second_name=second_name, email=email, password=password)
        self.user.save()
        Picture(user=self.user, photo="First_photo.png").save()
        Picture(user=self.user, photo="Second_photo.png").save()

        Settings(user=self.user, profile_pic="Profile_photo.png").save()

        self.client = Client()
        self.client.post("/login", data={"email": self.user.email, "password": self.user.password})

    def test_logout_leads_to_login_page(self):
        # setup
        response = self.client.get("/logout")

        # Test
        self.assertEqual(response.status_code, 302)
        self.assertRegexpMatches(response.url, "login")

    def test_logout_link_is_available_at_home(self):
        # setup
        response = self.client.get("/home")

        # Test
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, '<a href="/logout" class="">Logout</a>')
    def test_edit_site(self):
        c = Client()
        val = c.login(username = "******",password = "******")

        print 'the login value is: %s' % val

        data= {'site_name':u'kibuye',
               'comission_date':datetime(2015,12,11,22,0),
               'location_city':u'kigali',
               'location_country':u'rwanda',
               'time_zone':'Africa/Kigali',
               'position_0':36,
               'position_1':42,
               'installed_kw':2,
               'system_voltage':4,
               'number_of_panels':100,
               'site_Id':2,
               'battery_bank_capacity':1200,
               'api_key': 'testing',
               'api_key_numeric': '123456'}

        response = c.post('/edit_site/' + str(self.site.id) , data)

        # Testing if the site has been edited succesfully
        self.assertEqual(response.status_code, 200)
        self.assertEqual(Sesh_Site.objects.first().site_name, 'kibuye')


        # Checking for another unauthorized user
        val = c.login(username="******",password="******")
        response = c.post('/edit_site/' + str(self.site.id), data)
        self.assertEqual(response.status_code, 403)
Example #26
0
class ViewTest(TestCase):
  def setUp(self):
      self.client_stub = Client()
      self.person = Person(first_name = 'TestFirst',last_name = 'TestLast')
      self.person.save()
      self.phone = Phone(person = self.person,number = '7778889999')
      self.phone.save()
  def test_view_home_route(self):
      response = self.client_stub.get('/')
      self.assertEquals(response.status_code, 200)
  def test_view_contacts_route(self):
      response = self.client_stub.get('/all/')
      self.assertEquals(response.status_code, 200)
  def test_add_contact_route(self):
      response = self.client_stub.get('/add/')
      self.assertEqual(response.status_code, 200)
  def test_create_contact_successful_route(self):
      response = self.client_stub.post('/create',data = {'first_name' : 'testFirst', 'last_name':'tester', 'email':'*****@*****.**', 'address':'1234 nowhere', 'city':'far away', 'state':'CO', 'country':'USA', 'number':'987654321'})
      self.assertEqual(response.status_code, 302)
  def test_create_contact_unsuccessful_route(self):
      response = self.client_stub.post('/create',data = {'first_name' : 'tester_first_n@me', 'last_name':'test', 'email':'*****@*****.**', 'address':'5678 everywhere', 'city':'far from here', 'state':'CA', 'country':'USA', 'number':'987654321'})
      self.assertEqual(response.status_code, 200)
  def tearDown(self):
      self.phone.delete()
      self.person.delete()  
Example #27
0
File: tests.py Project: karek/www3
class TestClient(unittest.TestCase):
    def setUp(self):
        # Every test needs a client.
        self.client = Client()
        g = Gmina.objects.create(nazwa="Jakas")
        self.o = Obwod.objects.create(adres="Blabla", gmina=g)


    def test_getting_obwod(self):
        response = self.client.post('/obwod/', {'obw_id': self.o.id})

        # Check that the response is 200 OK.
        self.assertEqual(response.status_code, 200)

        data = json.loads(response.content)
        self.assertEqual(self.o.toDict(), data)

    def test_saving_obwod(self):
        response = self.client.post('/save/', {'obw_id': self.o.id, 'ileKart': '3', 'upr': '4', 'wer': '0'})

        # Check that the response is 200 OK.
        self.assertEqual(response.status_code, 200)

        data = json.loads(response.content)

        self.assertEqual(1, data['dict']['wer'])
        self.assertEqual('3', data['dict']['ile'])
        self.assertEqual('4', data['dict']['upr'])
        self.assertEqual(self.o.id, data['dict']['id'])
        self.assertEqual('Blabla', data['dict']['adres'])
        self.assertEqual(False, data['err'])
Example #28
0
    def test_registration_api_fails_if_user_exists(self):
        c = Client()
        response = c.post('/register/', {'username': '******',
                                         'password': '******',
                                         'email': '*****@*****.**',
                                         'first_name':'John',
                                         'last_name':'smith',
                                         'security_question':'mother maiden name',
                                         'security_answer':'andrews',
                                         'gender':'male',
                                         'phone_number':'1231231233'})
        second_response = c.post('/register/', {'username': '******',
                                         'password': '******',
                                         'email': '*****@*****.**',
                                         'first_name':'John',
                                         'last_name':'smith',
                                         'security_question':'mother maiden name',
                                         'security_answer':'andrews',
                                         'gender':'male',
                                         'phone_number':'1231231233'})

        
        self.assertEqual(second_response.status_code, 400)
        saved_user = ITUUser.objects.filter(username='******')
        # still should only have one
        self.assertEqual(len(saved_user), 1)
Example #29
0
    def test_session_auth_post_requires_csrf_token(self):
        """ Verify non-GET requests require a CSRF token be attached to the request. """
        user = UserFactory(password=self.password, is_staff=True)
        client = Client(enforce_csrf_checks=True)
        self.assertTrue(client.login(username=user.username, password=self.password))

        data = {
            'course_key': 'a/b/c',
            'enabled': True
        }

        # POSTs without a CSRF token should fail.
        response = client.post(self.path, data=json.dumps(data), content_type=JSON)

        # NOTE (CCB): Ordinarily we would expect a 403; however, since the CSRF validation and session authentication
        # fail, DRF considers the request to be unauthenticated.
        self.assertEqual(response.status_code, 401)
        self.assertIn('CSRF', response.content)

        # Retrieve a CSRF token
        response = client.get('/dashboard')
        csrf_token = response.cookies[settings.CSRF_COOKIE_NAME].value  # pylint: disable=no-member
        self.assertGreater(len(csrf_token), 0)

        # Ensure POSTs made with the token succeed.
        response = client.post(self.path, data=json.dumps(data), content_type=JSON, HTTP_X_CSRFTOKEN=csrf_token)
        self.assertEqual(response.status_code, 201)
class PasswordResetChangeTest(ShadowConTestCase):
    def setUp(self):
        self.client = Client()

    def run_test(self, key):
        response = self.client.get(reverse(key))
        self.assertSectionContains(response, "ShadowCon 2016", "title")
        return response

    def test_login(self):
        response = self.run_test('login')
        self.assertSectionContains(response, '<p><a href="%s">%s</a></p>' % (reverse('password_reset'),
                                                                             'Lost password\\?'),
                                   'section id="main" role="main"', '/section')
        self.assertSectionContains(response, '<p><a href="%s">%s</a></p>' % (reverse('convention:new_user'),
                                                                             'Create New Account'),
                                   'section id="main" role="main"', '/section')

    def test_logout(self):
        response = self.run_test('logout')
        self.assertSectionContains(response, 'You have successfully logged out',
                                   'section id="main" role="main"', '/section')

    def test_password_change(self):
        self.client.login(username="******", password="******")
        response = self.run_test('password_change')
        self.assertSectionContains(response, 'Enter new password', 'section id="main" role="main"', '/section')

    def test_password_change_done(self):
        self.client.login(username="******", password="******")
        response = self.run_test('password_change_done')
        self.assertSectionContains(response, '<h2>Password Changed</h2>', 'section id="main" role="main"', '/section')

    def test_password_reset(self):
        response = self.run_test('password_reset')
        self.assertSectionContains(response, 'Forgotten your password\\? Enter your',
                                   'section id="main" role="main"', '/section')

    def test_password_reset_done(self):
        response = self.run_test('password_reset_done')
        self.assertSectionContains(response, 'Password reset sent', 'section id="main" role="main"', '/section')

    def test_password_reset_confirm_invalid_link(self):
        response = self.client.get(reverse('password_reset_confirm', args=["invalid", "4a8-cd1bf13135ee4cae7176"]))
        self.assertSectionContains(response, "ShadowCon 2016", "title")
        self.assertSectionContains(response, 'The password reset link was invalid',
                                   'section id="main" role="main"', '/section')

    def test_password_reset_confirm_valid_link(self):
        self.client.post(reverse('password_reset'), {"email": "*****@*****.**"})

        email = self.get_email()
        start = str(email.body).index('/reset')
        stop = str(email.body).index('Your username, in case you\'ve forgotten: user')
        link = str(email.body)[start:stop].strip()

        response = self.client.get(link)
        self.assertSectionContains(response, "ShadowCon 2016", "title")
        self.assertSectionContains(response, 'Please enter your new password twice',
                                   'section id="main" role="main"', '/section')
Example #31
0
class TestBuildbot2HTTPStatusPush(TransactionTestCase):
    reset_sequences = True
    build_data = """
                {
                    "buildid": 7646,
                    "builderid": 3420,
                    "workerid": 21,
                    "started_at": 1596624615,
                    "complete_at": 1596624754,
                    "complete": true,
                    "state_string": "build successful",
                    "properties": {
                        "portname": [
                            "portA",
                            "Trigger"
                        ],
                        "workername": [
                            "ports-darwin20-x86_64",
                            "Worker"
                        ],
                        "portrevision": [
                            "0",
                            "SetPropertyFromCommand Step"
                        ],
                        "portversion": [
                            "1.2",
                            "SetPropertyFromCommand Step"
                        ]
                    }
                }
                """

    invalid_build_data = """
                {
                    "buildid": 7646,
                    "builderid": 3420,
                    "workerid": 21,
                    "started_at": 1596624615,
                    "complete_at": 1596624754,
                }
                """

    def setUp(self):
        self.client = Client()

    def test_new_builder_added(self):
        Builder.objects.create(name="builder-1")

        self.assertEquals(Builder.objects.all().count(), 1)

        # Now make a push, new builder should be added automatically
        response = self.client.post(reverse('buildbot2_submit'),
                                    data=self.build_data,
                                    content_type='text/plain')
        self.assertEquals(Builder.objects.all().count(), 2)

        # Make same call again
        response = self.client.post(reverse('buildbot2_submit'),
                                    data=self.build_data,
                                    content_type='text/plain')
        self.assertEquals(Builder.objects.all().count(), 2)
        self.assertEquals(BuildHistory.objects.all().count(), 1)

    def test_invalid_build_data(self):
        response = self.client.post(reverse('buildbot2_submit'),
                                    data=self.invalid_build_data,
                                    content_type='text/plain')
        self.assertEquals(BuildHistory.objects.all().count(), 0)
        self.assertEquals(Builder.objects.all().count(), 0)

    def test_build_properties(self):
        response = self.client.post(reverse('buildbot2_submit'),
                                    data=self.build_data,
                                    content_type='text/plain')

        self.assertEquals(BuildHistory.objects.all().count(), 1)

        build_object = BuildHistory.objects.get(build_id=7646)

        self.assertEquals(build_object.status, "build successful")
        self.assertEquals(build_object.port_name, "portA")
        self.assertEquals(build_object.port_version, "1.2")
        self.assertEquals(build_object.port_revision, "0")
Example #32
0
 def testAddImpactMissingRequired(self):
     c = Client()
     response = c.post('/add_impact/', { 'impact_type': 1, 'location_name': 'Missing', 'comment': 'My Comment'})
     self.assertEquals(response.content, 'error')
class CaseUpdateViewTest(TestCase):
    def setUp(self):
        super().setUp()
        self.client = Client()
        self.user = User.objects.create_user(username='******', password='******')
        self.user.save()
        self.test_case = Cases.objects.create(date='2020-05-06', author=self.user, case_code='qwerty', images='ct',
                                              case='s', product='knee', software='mimics', procedure='rec', time=60)
        self.test_case.save()

    def test_redirect_if_not_logged_in(self):
        resp = self.client.get(reverse('report:case-update', kwargs={'slug': self.test_case.id, }))
        self.assertEqual(resp.status_code, 302)
        self.assertTrue(resp.url.startswith('/accounts/login/'))

    def test_view_uses_correct_template(self):
        self.client.login(username='******', password='******')
        resp = self.client.get(reverse('report:case-update', kwargs={'slug': self.test_case.id, }))
        self.assertEqual(resp.status_code, 200)

        self.assertTemplateUsed(resp, 'report/case_update.html')

    def test_redirect_to_all_cases(self):
        self.client.login(username='******', password='******')
        resp = self.client.post(
            reverse('report:case-update', kwargs={'slug': self.test_case.id, }),
            {'date': '2020-05-06', 'case_code': '12345', 'images': 'ct', 'case': 's', 'product': 'knee',
             'software': 'mimics', 'procedure': 'check', 'time': '55'},
        )
        self.assertRedirects(resp, reverse('report:all-cases'))

    def test_update_date(self):
        self.client.login(username='******', password='******')
        resp = self.client.get(reverse('report:case-update', kwargs={'slug': self.test_case.id, }))
        self.assertEqual(resp.status_code, 200)
        resp = self.client.post(
            reverse('report:case-update', kwargs={'slug': self.test_case.id, }),
            {'date': '2019-05-06', 'case_code': 'qwerty', 'images': 'ct', 'case': 's', 'product': 'knee',
             'software': 'mimics', 'procedure': 'rec', 'time': '60'},)
        case = Cases.objects.get()
        self.assertEqual(str(case.date), '2019-05-06')

    @ddt.data('new_case_code')
    def test_update_case_code(self, case_code):
        self.client.login(username='******', password='******')
        resp = self.client.get(reverse('report:case-update', kwargs={'slug': self.test_case.id, }))
        self.assertEqual(resp.status_code, 200)
        resp = self.client.post(
            reverse('report:case-update', kwargs={'slug': self.test_case.id, }),
            {'date': '2020-05-06', 'case_code': case_code, 'images': 'ct', 'case': 's', 'product': 'knee',
             'software': 'mimics', 'procedure': 'rec', 'time': '60'},)
        case = Cases.objects.get()
        self.assertEqual(case.case_code, case_code)

    @ddt.data('ct', 'mri')
    def test_update_images(self, images):
        self.client.login(username='******', password='******')
        resp = self.client.get(reverse('report:case-update', kwargs={'slug': self.test_case.id, }))
        self.assertEqual(resp.status_code, 200)
        resp = self.client.post(
            reverse('report:case-update', kwargs={'slug': self.test_case.id, }),
            {'date': '2020-05-06', 'case_code': 'qwerty', 'images': images, 'case': 's', 'product': 'knee',
             'software': 'mimics', 'procedure': 'rec', 'time': '60'},)
        case = Cases.objects.get()
        self.assertEqual(case.images, images)

    @ddt.data('s', 'o')
    def test_update_case(self, test_case):
        self.client.login(username='******', password='******')
        resp = self.client.get(reverse('report:case-update', kwargs={'slug': self.test_case.id, }))
        self.assertEqual(resp.status_code, 200)
        resp = self.client.post(
            reverse('report:case-update', kwargs={'slug': self.test_case.id, }),
            {'date': '2020-05-06', 'case_code': 'qwerty123', 'images': 'ct', 'case': test_case, 'product': 'knee',
             'software': 'mimics', 'procedure': 'rec', 'time': '60'}, )
        case = Cases.objects.get()
        self.assertEqual(case.case, test_case)

    @ddt.data('spine', 'knee', 'hip', 'shoulder', 'forearm', 'wrist', 'ankle', )
    def test_update_product(self, product):
        self.client.login(username='******', password='******')
        resp = self.client.get(reverse('report:case-update', kwargs={'slug': self.test_case.id, }))
        self.assertEqual(resp.status_code, 200)
        resp = self.client.post(
            reverse('report:case-update', kwargs={'slug': self.test_case.id, }),
            {'date': '2020-05-06', 'case_code': 'qwerty123', 'images': 'ct', 'case': 's', 'product': product,
             'software': 'mimics', 'procedure': 'rec', 'time': '60'}, )
        case = Cases.objects.get()
        self.assertEqual(case.product, product)

    @ddt.data('mimics', 'avizo')
    def test_update_software(self, software):
        self.client.login(username='******', password='******')
        resp = self.client.get(reverse('report:case-update', kwargs={'slug': self.test_case.id, }))
        self.assertEqual(resp.status_code, 200)
        resp = self.client.post(
            reverse('report:case-update', kwargs={'slug': self.test_case.id, }),
            {'date': '2020-05-06', 'case_code': 'qwerty123', 'images': 'ct', 'case': 's', 'product': 'knee',
             'software': software, 'procedure': 'rec', 'time': '60'}, )
        case = Cases.objects.get()
        self.assertEqual(case.software, software)

    @ddt.data('rec', 'check')
    def test_update_procedure(self, procedure):
        self.client.login(username='******', password='******')
        resp = self.client.get(reverse('report:case-update', kwargs={'slug': self.test_case.id, }))
        self.assertEqual(resp.status_code, 200)
        resp = self.client.post(
            reverse('report:case-update', kwargs={'slug': self.test_case.id, }),
            {'date': '2020-05-06', 'case_code': 'qwerty123', 'images': 'ct', 'case': 's', 'product': 'knee',
             'software': 'mimics', 'procedure': procedure, 'time': '60'}, )
        case = Cases.objects.get()
        self.assertEqual(case.procedure, procedure)

    @ddt.data(25, 35)
    def test_update_time(self, time):
        self.client.login(username='******', password='******')
        resp = self.client.get(reverse('report:case-update', kwargs={'slug': self.test_case.id, }))
        self.assertEqual(resp.status_code, 200)
        resp = self.client.post(
            reverse('report:case-update', kwargs={'slug': self.test_case.id, }),
            {'date': '2020-05-06', 'case_code': 'qwerty123', 'images': 'ct', 'case': 's', 'product': 'knee',
             'software': 'mimics', 'procedure': 'rec', 'time': time}, )
        case = Cases.objects.get()
        self.assertEqual(case.time, time)
Example #34
0
class TestNodesView(TestCase):
    def setUp(self):

        self.testcase_user = create_root_user()
        self.client = Client()
        self.client.login(testcase_user=self.testcase_user)

    def test_alltags_view(self):
        """
        GET /alltags/

        returns all tags of current user
        """
        Tag.objects.create(user=self.testcase_user, name="tag1")
        Tag.objects.create(user=self.testcase_user, name="tag2")

        alltags_url = reverse('core:alltags')

        ret = self.client.get(
            alltags_url,
            content_type='application/json',
            HTTP_X_REQUESTED_WITH='XMLHttpRequest',
        )
        self.assertEqual(ret.status_code, 200)
        tags = json.loads(ret.content)

        self.assertEqual(set([tag['name'] for tag in tags['tags']]),
                         set(["tag2", "tag1"]))

    def test_validate_tags_against_xss(self):

        p = Folder.objects.create(title="P", user=self.testcase_user)

        ret = self.client.post(
            reverse('core:tags', args=(p.id, )),
            {'tags': [{
                "name": "xss<script>alert('hi!')</script>"
            }]},
            content_type='application/json',
            HTTP_X_REQUESTED_WITH='XMLHttpRequest',
        )

        self.assertEquals(ret.status_code, 400)

    def test_associate_tags_to_folder(self):

        p = Folder.objects.create(title="P", user=self.testcase_user)

        ret = self.client.post(
            reverse('core:tags', args=(p.id, )),
            {'tags': [{
                "name": "red"
            }, {
                "name": "green"
            }]},
            content_type='application/json',
            HTTP_X_REQUESTED_WITH='XMLHttpRequest',
        )

        self.assertEquals(ret.status_code, 200)

        found_folders = Folder.objects.filter(
            tags__name__in=["red", "green"]).distinct()

        self.assertEqual(found_folders.count(), 1)

    def test_create_one_tag_in_tags_view(self):
        """
        User create tags in tags list view (left menu - tags).
        Tags are created per user.
        """
        tag_count = Tag.objects.filter(user=self.testcase_user,
                                       name="tag_x").count()

        self.assertEquals(tag_count, 0)

        ret = self.client.post(
            reverse('admin:tag-add'),
            {
                "name": "tag_x",
                "fg_color": "#ffffff",
                "bg_color": "#c41fff"
            },
        )

        self.assertEquals(ret.status_code, HttpResponseRedirect.status_code)

        tag_count = Tag.objects.filter(user=self.testcase_user,
                                       name="tag_x").count()

        self.assertEquals(tag_count, 1)
Example #35
0
def run():
    client = Client()
    client.login(username=SUPERUSER_USERNAME, password=SUPERUSER_PASSWORD)

    # setup the Flowvisor
    response = test_get_and_post_form(
        client,
        reverse("set_flowvisor"),
        params=dict(
            name="flowvisor",
            username=FV_USERNAME,
            password=FV_PASSWORD,
            password2=FV_PASSWORD,
            url=FV_URL,
        ),
    )
    assert response.status_code == 301

    # setup the Clearinghouse user
    response = test_get_and_post_form(
        client,
        reverse("set_clearinghouse"),
        params=dict(
            username=CH_USERNAME,
            password1=CH_PASSWORD,
            password2=CH_PASSWORD,
        ),
    )
    assert response.status_code == 301

    client.logout()

    for username, info in USER_INFO.items():
        # create user
        User.objects.create_user(username=username,
                                 email=info["email"],
                                 password=info["password"])

        client.login(username=username, password=info["password"])
        # request flowspace
        for fs in info["flowspace"]:
            response = test_get_and_post_form(
                client,
                reverse("user_reg_fs"),
                params=dict(
                    mac_addr=fs["mac_addr"],
                    ip_addr=fs["ip_addr"],
                ),
            )
            assert response.status_code == 301
        client.logout()

    # Login to approve user requests
    client.login(username=SUPERUSER_USERNAME, password=SUPERUSER_PASSWORD)

    # Parse the approval form
    resp = client.get(reverse("approve_user_reg_table"))

    # Get all the forms
    d = pq(resp.content, parser="html")
    forms = d("form")
    for f in forms:
        # only post to approve urls
        if "approve" in f.action:
            client.post(f.action, {})

    client.logout()
Example #36
0
class LoginTestCase(TestCase):
    """
    test cases for logging in and signing up (users)
    can use c = Client() for creating a client and
    response = c.post(url, context_params) to post data to the url page
    response = c.get(url) to get the page (doing c.get(url, follow=True) allows you to get the redirect chain via response.redirect_chain )
    also
    c.login(username='******', password='******') to login users (returns True if successful)
    response.context[key] to get the context value for the key
    """
    def setUp(self):
        self.credentials = {'username': '******', 'password': '******'}
        User.objects.create_user(self.credentials)
        self.client = Client()

    """ using incorrect credentials; should not make valid form """

    def signup_with_incorrect_input(self):
        data = {
            'username': "******",
            'password1': "testuserpassword",
            'password2': "testuserpasswordwrong"
        }
        form = UserCreationForm(data=data)
        self.assertFalse(form.is_valid())

    """ using correct credentials; should make valid form """

    def signup_with_correct_input(self):
        data = {
            'username': "******",
            'password1': "testuserpassword",
            'password2': "testuserpassword"
        }
        form = UserCreationForm(data=data)
        self.assertFalse(form.is_valid())

    """ using incorrect credentials; should not make user logged in (active) """

    def login_with_incorrect_input(self):
        data = {
            'username': "******",
            'password1': "secretwrong",
        }
        response = self.client.post(reverse('login'), data)
        self.assertFalse(response.context['user'].is_active)

    """ using correct credentials; should make user logged in (active) """

    def login_with_correct_input(self):
        data = {
            'username': "******",
            'password1': "secret",
        }
        response = self.client.post(reverse('login'), data)
        self.assertTrue(response.context['user'].is_active)

    """ log out the user, should be inactive """

    def logout(self):
        self.client.get(reverse('logout'))
        self.assertFalse(response.context['user'].is_active)
Example #37
0
class GalleryTestCase(TestCase):
    def setUp(self):
        self.user1 = user_model.User.objects.create_user(username='******',
                                                         password='******')

        level = Level(flavor="Plain",
                      plane_life_span=1,
                      max_today_write=3,
                      max_today_reply=3,
                      next_level_likes=10)
        level.save()

        author1 = User(user=self.user1,
                       today_write_count=3,
                       today_reply_count=3,
                       total_likes=2,
                       level=level)
        author1.save()

        self.photo1 = Photo(image='0.jpg',
                            is_reported=False,
                            color=4,
                            author=author1)
        self.photo1.save()

        self.photo2 = Photo(image='1.jpg',
                            is_reported=False,
                            color=1,
                            author=author1)
        self.photo2.save()

        self.photo3 = Photo(image='2.jpg',
                            is_reported=False,
                            color=2,
                            author=author1)
        self.photo3.save()

        self.photo4 = Photo(image='3.jpg',
                            is_reported=False,
                            color=3,
                            author=author1)
        self.photo4.save()

        self.photo5 = Photo(image='4.jpeg',
                            is_reported=False,
                            color=4,
                            author=author1)
        self.photo5.save()

        self.client = Client()

    def generate_photo_file(self):
        file = io.BytesIO()
        image = Image.new('RGBA', size=(100, 100), color=(155, 0, 0))
        image.save(file, 'png')
        file.name = 'test.png'
        file.seek(0)
        return file

    def test_photo_list_get(self):
        # Sign-in
        response = self.client.get('/api/photo/random/')
        self.assertEqual(response.status_code, 200)
        data = json.loads(response.content.decode())
        self.assertEqual(len(data), 5)

    def test_photo_list_post(self):
        image_file = self.generate_photo_file()

        response = self.client.post('/api/photo/', {
            'image': image_file,
            'is_reported': 'False',
            'color': '5'
        },
                                    format='multipart')
        self.assertEqual(response.status_code, 400)

    def test_photo_list_get_by_color(self):
        response = self.client.get('/api/photo/color/4/')
        self.assertEqual(response.status_code, 200)
        data = json.loads(response.content.decode())
        self.assertEqual(len(data), 2)

    def test_photo_detail_report(self):
        id = self.photo3.id
        response = self.client.put('/api/photo/{}/report/'.format(id), {},
                                   format='multipart')
        self.assertEqual(response.status_code, 204)

        response = self.client.get('/api/photo/{}/'.format(id))
        data = json.loads(response.content.decode())
        self.assertEqual(data['id'], id)

    def test_photo_detail_delete(self):
        id = self.photo1.id
        response = self.client.delete('/api/photo/{}/'.format(id))
        self.assertEqual(response.status_code, 204)

        response = self.client.get('/api/photo/{}/'.format(id))
        self.assertEqual(response.status_code, 404)
Example #38
0
class SearchChklstTest(TransactionTestCase):
    def setUp(self):
        self.my_company = Company.objects.create(company_name='toto')
        self.my_company2 = Company.objects.create(company_name='toto2')
        self.my_manager = Manager.objects.create(mgr_name='mymanager',
                                                 mgr_company=self.my_company)
        self.my_manager2 = Manager.objects.create(mgr_name='mymanager2',
                                                  mgr_company=self.my_company)
        self.my_checklist = CheckList.objects.create(
            chk_key="toto2",
            chk_title='Libellé',
            chk_company=self.my_company,
            chk_enable=True,
        )
        self.my_material = Material.objects.create(
            mat_designation="mymaterial",
            mat_registration='Libellé',
            mat_type="zzz",
            mat_model="aaa",
            mat_enable=True,
            mat_company=self.my_company,
            mat_manager=self.my_manager,
        )
        self.my_material2 = Material.objects.create(
            mat_designation="mamaterial2",
            mat_registration='Libellé',
            mat_type="zzz",
            mat_model="aaa",
            mat_enable=True,
            mat_company=self.my_company,
            mat_manager=self.my_manager,
        )
        self.c = Client()
        self.user = self.c.force_login(
            User.objects.get_or_create(username='******',
                                       user_company=self.my_company)[0])
        self.new_chklst_done = CheckListDone.objects.create(
            cld_status=1,
            cld_key='unique_key',
            cld_pdf_file="fic.pdf",
            cld_valid=True,
            cld_user=self.user,
            cld_checklist=self.my_checklist,
            cld_material=self.my_material,
            cld_manager=self.my_manager,
            cld_company=self.my_company)
        self.new_chklst_done2 = CheckListDone.objects.create(
            cld_status=1,
            cld_key='unique_key2',
            cld_pdf_file="fic.pdf",
            cld_valid=True,
            cld_user=self.user,
            cld_checklist=self.my_checklist,
            cld_material=self.my_material2,
            cld_manager=self.my_manager,
            cld_company=self.my_company)

    def test_VIEW_autocomplete_search_chklst_1param_is_OK(self):
        """"
        verify  Ajax search_chklst material parameter is OK --> returns 1 chklst
        """
        print(inspect.currentframe().f_code.co_name)
        data = {
            'material': self.my_material.id,
        }
        data = json.dumps(data)
        response = self.c.post("/app_home/search_chklst/",
                               data,
                               content_type="application/json")
        assert response.status_code == 200
        assert '"unique_key"' in response.content.decode("utf-8")
        assert '"unique_key2"' not in response.content.decode("utf-8")

    def test_VIEW_autocomplete_search_chklst_2returns_is_OK(self):
        """"
        verify  Ajax search_chklst parameter manager is OK (parameter manager --> returns 2 checklists)
        """
        print(inspect.currentframe().f_code.co_name)
        data = {
            'manager': self.my_manager.id,
        }
        data = json.dumps(data)
        response = self.c.post("/app_home/search_chklst/",
                               data,
                               content_type="application/json")
        assert response.status_code == 200
        assert '"unique_key"' in response.content.decode("utf-8")
        assert '"unique_key2"' in response.content.decode("utf-8")
Example #39
0
class pages_views_test(TestCase):
    def setUp(self):
        self.client = Client()
        self.user = User.objects.create_superuser('*****@*****.**',
                                                  'microtest', 'mp')
        self.page = Page.objects.create(title='Page', content='page_content')
        # self.menu = Menu.objects.create(title='main', url='micro.in', status='on', lvl=1)

    def test_views(self):
        user_login = self.client.login(username='******', password='******')
        self.assertTrue(user_login)

        response = self.client.get('/blog/')
        self.assertEqual(response.status_code, 200)

        response = self.client.get('/portal/content/page/')
        self.assertEqual(response.status_code, 200)

        response = self.client.get('/portal/content/page/new/')
        self.assertEqual(response.status_code, 200)

        response = self.client.post('/portal/content/page/new/', {
            'title': 'Page2',
            'content': 'page_content'
        })
        self.assertEqual(response.status_code, 200)
        self.assertTrue('Page created successfully' in response.content)

        response = self.client.post('/portal/content/page/new/',
                                    {'content': 'page_content'})
        self.assertEqual(response.status_code, 200)
        self.assertFalse('Page created successfully' in response.content)

        response = self.client.get('/portal/content/menu')
        self.assertEqual(response.status_code, 301)

        response = self.client.get('/portal/content/menu/new/')
        self.assertEqual(response.status_code, 200)

        ## With right input
        response = self.client.post('/portal/content/menu/new/', {
            'title': 'main',
            'url': 'micro.in/m',
            'status': 'on'
        })
        self.assertEqual(response.status_code, 200)
        self.assertTrue('Menu created successfully' in response.content)

        # Test cases for changing menu order
        response = self.client.post('/portal/content/menu/1/order/',
                                    {'mode': 'down'})
        self.assertTrue(response.status_code, 200)
        self.assertTrue('You cant move down' in response.content)

        response = self.client.post('/portal/content/menu/1/order/',
                                    {'mode': 'up'})
        self.assertTrue(response.status_code, 200)
        self.assertTrue('You cant move up' in response.content)

        ##with wrong input
        response = self.client.post('/portal/content/menu/new/', {
            'url': 'micro.in/m',
            'status': 'on'
        })
        self.assertEqual(response.status_code, 200)
        self.assertFalse('successfully' in response.content)

        response = self.client.get('/portal/content/page/edit/' +
                                   str(self.page.id) + '/')
        self.assertEqual(response.status_code, 200)

        response = self.client.get('/portal/content/menu/')
        self.assertEqual(response.status_code, 200)

        response = self.client.post(
            '/portal/content/page/edit/' + str(self.page.id) + '/', {
                'title': 'Page',
                'content': 'page_content'
            })
        self.assertEqual(response.status_code, 200)
        self.assertTrue('successfully' in response.content)

        response = self.client.post(
            '/portal/content/page/edit/' + str(self.page.id) + '/',
            {'content': 'page_content'})
        self.assertEqual(response.status_code, 200)
        self.assertFalse('successfully' in response.content)

        ##chnage menu status to off
        response = self.client.get('/portal/content/menu/status/1/')
        self.assertEqual(response.status_code, 302)

        ##change menu status to on
        response = self.client.get('/portal/content/menu/status/1/')
        self.assertEqual(response.status_code, 302)

        response = self.client.get('/portal/content/menu/edit/1/')
        self.assertTrue(response.status_code, 200)

        response = self.client.post('/portal/content/menu/edit/1/', {
            'title': 'main2',
            'url': 'micro.in/menu',
            'status': 'on'
        })
        self.assertTrue(response.status_code, 200)
        self.assertTrue('updated successfully' in response.content)

        response = self.client.post('/portal/content/menu/edit/1/', {
            'title': 'main2',
            'url': 'micro.in/menu',
            'status': 'on',
            'parent': 1
        })
        self.assertTrue(response.status_code, 200)
        self.assertTrue(
            'can not choose the same as parent' in response.content)

        response = self.client.post('/portal/content/menu/edit/1/', {
            'title': 'main2',
            'url': 'micro.in/menu',
            'status': 'on',
            'parent': 2
        })
        self.assertTrue(response.status_code, 200)
        #self.assertTrue('can not choose the same as parent' in response.content)

        response = self.client.post('/portal/content/menu/edit/1/', {
            'url': 'micro.in',
            'status': 'on'
        })
        self.assertTrue(response.status_code, 200)
        self.assertFalse('successfully' in response.content)

        response = self.client.post('/portal/content/menu/new/', {
            'title': 'menu2',
            'url': 'http://micro.com/menu2',
            'status': 'on'
        })
        self.assertEqual(response.status_code, 200)
        self.assertTrue('Menu created successfully' in response.content)

        # Test cases for changing menu order
        response = self.client.post('/portal/content/menu/1/order/',
                                    {'mode': 'down'})
        self.assertTrue(response.status_code, 200)

        response = self.client.post('/portal/content/menu/1/order/',
                                    {'mode': 'up'})
        self.assertTrue(response.status_code, 200)

        response = self.client.post('/portal/content/menu/edit/1/', {
            'title': 'main2',
            'url': 'micro.in/menu',
            'status': 'on',
            'parent': 2
        })
        self.assertTrue(response.status_code, 200)
        self.assertTrue('updated successfully' in response.content)

        response = self.client.get('/portal/content/menu/delete_menu/1/')
        self.assertTrue(response.status_code, 200)

        response = self.client.get('/page2/')
        self.assertEqual(response.status_code, 200)

        response = self.client.get('/portal/content/page/delete/' +
                                   str(self.page.id) + '/')
        self.assertEqual(response.status_code, 302)
Example #40
0
class SearchTest(TransactionTestCase):
    def setUp(self):
        self.my_company = Company.objects.create(company_name='toto')
        self.my_company2 = Company.objects.create(company_name='toto2')
        self.my_manager = Manager.objects.create(mgr_name='mymanager',
                                                 mgr_company=self.my_company)
        self.my_manager2 = Manager.objects.create(mgr_name='mymanager2',
                                                  mgr_company=self.my_company)
        self.my_checklist = CheckList.objects.create(
            chk_key="toto2",
            chk_title='Libellé',
            chk_company=self.my_company,
            chk_enable=True,
        )
        self.my_material = Material.objects.create(
            mat_designation="mymaterial",
            mat_registration='Libellé',
            mat_type="zzz",
            mat_model="aaa",
            mat_enable=True,
            mat_company=self.my_company,
            mat_manager=self.my_manager,
        )
        self.my_material2 = Material.objects.create(
            mat_designation="mamaterial2",
            mat_registration='Libellé',
            mat_type="zzz",
            mat_model="aaa",
            mat_enable=True,
            mat_company=self.my_company,
            mat_manager=self.my_manager,
        )

        self.c = Client()

    def test_VIEW_autocomplete_search_mat_is_OK(self):
        """"
        verify  Ajax autocomplete_search_mat is OK
        """
        print(inspect.currentframe().f_code.co_name)
        self.c.force_login(
            User.objects.get_or_create(username='******',
                                       user_company=self.my_company)[0])
        data = {
            'manager': self.my_manager.id,
        }
        data = json.dumps(data)
        response = self.c.post("/app_home/autocomplete_search_mat/",
                               data,
                               content_type="application/json")
        assert response.status_code == 200
        assert '"mymaterial"' in response.content.decode("utf-8")

    def test_VIEW_autocomplete_search_man_is_OK(self):
        """"
        verify  Ajax autocomplete_search_man is OK
        """
        print(inspect.currentframe().f_code.co_name)
        self.c.force_login(
            User.objects.get_or_create(username='******',
                                       user_company=self.my_company)[0])
        data = {
            'material': self.my_material.id,
        }
        data = json.dumps(data)
        response = self.c.post("/app_home/autocomplete_search_man/",
                               data,
                               content_type="application/json")
        assert response.status_code == 200
        assert '"mymanager"' in response.content.decode("utf-8")
Example #41
0
class TestViews(TestCase):
    """
    Includes tests for all the functionality
    associated with Views
    """
    def setUp(self):
        self.client = Client()
        self.other_client = Client()
        self.user = get_user_model().objects.create_user(
            username='******',
            email='*****@*****.**',
            password='******'
        )
        self.other_user = get_user_model().objects.create_user(
            username='******',
            email='*****@*****.**',
            password='******'
        )
        self.client.login(username='******', password='******')
        self.other_client.login(
            username='******', password='******')
        self.question_one = Question.objects.create(
            user=self.user, title='This is a sample question',
            description='This is a sample question description',
            tags='test1,test2')
        self.question_two = Question.objects.create(
            user=self.user,
            title='A Short Title',
            description='''This is a really good content, just if somebody
            published it, that would be awesome, but no, nobody wants to
            publish it, because they know this is just a test, and you
            know than nobody wants to publish a test, just a test;
            everybody always wants the real deal.''',
            favorites=0,
            has_accepted_answer=True
        )
        self.answer = Answer.objects.create(
            user=self.user,
            question=self.question_two,
            description='A reaaaaally loooong content',
            votes=0,
            is_accepted=True
        )

    def test_index_questions(self):
        response = self.client.get(reverse('questions'))
        self.assertEqual(response.status_code, 200)
        self.assertTrue(
            'This is a sample question' in str(response.context['question']))

    def test_create_question_view(self):
        """
        """
        current_question_count = Question.objects.count()
        response = self.client.post(reverse('ask'),
                                    {'title': 'Not much of a title',
                                     'description': 'babla',
                                     'tags': 'test, tag'})
        self.assertEqual(response.status_code, 302)
        new_question = Question.objects.first()
        self.assertEqual(new_question.title, 'Not much of a title')
        self.assertEqual(Question.objects.count(),
                         current_question_count + 1)

    def test_answered_questions(self):
        response = self.client.get(reverse('answered'))
        self.assertEqual(response.status_code, 200)
        self.assertTrue('A Short Title' in str(response.context['question']))

    def test_all_questions_view(self):
        response = self.client.get(reverse('all'))
        self.assertEqual(response.status_code, 200)
        self.assertTrue('A Short Title' in str(response.context['question']))

    def test_individual_question(self):
        response = self.client.get(
            '/questions/{}/'.format(self.question_one.id))
        self.assertEqual(response.status_code, 200)
        self.assertTrue(
            'This is a sample question' in str(response.context['question']))

    def test_answer_question(self):
        current_answer_count = Answer.objects.count()
        response = self.client.post(
            reverse('answer'),
            {'question': self.question_one.id,
             'description': 'A reaaaaally loooong content'})
        self.assertEqual(response.status_code, 302)
        self.assertEqual(Answer.objects.count(), current_answer_count + 1)

    def test_empty_answer(self):
        current_answer_count = Answer.objects.count()
        response = self.client.post(reverse('answer'),
                                    {'question': self.question_one.id})
        self.assertEqual(response.status_code, 200)
        self.assertEqual(Answer.objects.count(), current_answer_count)

    def test_answer_redirects(self):
        response = self.other_client.get(reverse('answer'))
        self.assertRedirects(response, reverse('questions'), status_code=302)
Example #42
0
class TestAPI(TestCase):
    fixtures = [
        'organization_types.json', 'organization_government.json',
        'organization_balance_gov.json', 'credit_trade_statuses.json',
        'credit_trade_statuses_refused.json',
        'organization_actions_types.json', 'organization_statuses.json',
        'test_users.json', 'credit_trade_types.json',
        'test_credit_trades.json', 'test_organization_fuel_suppliers.json',
        'test_organization_balances.json', 'roles.json', 'permissions.json',
        'roles_permissions.json'
    ]

    def setUp(self):

        # Initialize Foreign keys
        # self.ct_status_id = fake_api_calls?.create_credit_trade_status()
        self.ct_type_id = fake_api_calls.create_credit_trade_type()
        self.fs1_id, self.fs1_status_id, self.fs1_action_type_id = (
            fake_api_calls.create_organization())
        self.user_id = fake_api_calls.create_user(self.fs1_id)
        resp_user = User.objects.get(id=self.user_id)
        resp_user.authorization_guid = 'e46435c1-7d69-489f-9dde-83005cd77744'
        resp_user.save()
        '''
        Apply a fuel supplier role to the default user
        '''
        fs_user = User.objects.get(username='******')
        fs_role = Role.objects.get(name='FSManager')
        UserRole.objects.create(user_id=fs_user.id, role_id=fs_role.id)
        '''
        Apply a fuel supplier role to the respondent user
        '''
        fs_role = Role.objects.get(name='FSManager')
        UserRole.objects.create(user_id=resp_user.id, role_id=fs_role.id)

        self.credit_trade = fake_api_calls.create_credit_trade(
            initiator=2,
            respondent=self.fs1_id,
            type=self.ct_type_id,
            status=STATUS_DRAFT,
            user_id=self.user_id,
        )

        self.client = Client(
            HTTP_SMGOV_USERGUID='c9804c52-05f1-4a6a-9d24-332d9d8be2a9',
            HTTP_SMGOV_USERDISPLAYNAME='Brad Smith',
            HTTP_SMGOV_USEREMAIL='*****@*****.**',
            HTTP_SM_UNIVERSALID='BSmith')

        self.gov_client = Client(
            HTTP_SMGOV_USERGUID='c2971372-3a96-4704-9b9c-18e4e9298ee3',
            HTTP_SMGOV_USERDISPLAYNAME='Test Person',
            HTTP_SMGOV_USEREMAIL='*****@*****.**',
            HTTP_SM_UNIVERSALID='Teperson',
            HTTP_SMGOV_USERTYPE='Internal',
            HTTP_SM_AUTHDIRNAME='IDIR')

        self.respondent_client = Client(
            HTTP_SMGOV_USERGUID='e46435c1-7d69-489f-9dde-83005cd77744',
            HTTP_SMGOV_USERDISPLAYNAME=resp_user.display_name,
            HTTP_SMGOV_USEREMAIL=resp_user.email)
        '''
        Apply a government role to Teperson
        '''
        gov_user = User.objects.get(username='******')
        gov_role = Role.objects.get(name='GovDirector')
        UserRole.objects.create(user_id=gov_user.id, role_id=gov_role.id)

        self.test_url = "/api/credit_trades"

        self.test_data_fail = [{
            'data': {
                'number_of_credits': 1
            },
            'response': {
                "status": ["This field is required."],
                "respondent": ["This field is required."],
                "type": ["This field is required."]
            }
        }, {
            'data': {
                'number_of_credits': 1,
                'status': STATUS_DRAFT
            },
            'response': {
                "respondent": ["This field is required."],
                "type": ["This field is required."],
            }
        }, {
            'data': {
                'number_of_credits': 1,
                'status': STATUS_DRAFT,
                'respondent': self.fs1_id
            },
            'response': {
                "type": ["This field is required."]
            }
        }]

        self.test_data_success = [{
            'data': {
                'number_of_credits': 1,
                'status': STATUS_DRAFT,
                'initiator': 2,
                'respondent': self.fs1_id,
                'type': self.ct_type_id
            },
        }]

    def test_current_user(self):
        response = self.client.get('/api/users/current')

        response_data = json.loads(response.content.decode("utf-8"))

        HTTP_SMGOV_USERGUID = 'c9804c52-05f1-4a6a-9d24-332d9d8be2a9'
        HTTP_SMGOV_USERDISPLAYNAME = 'Brad Smith'
        HTTP_SMGOV_USEREMAIL = '*****@*****.**'
        HTTP_SM_UNIVERSALID = 'BSmith'

        assert response_data['authorizationGuid'] == HTTP_SMGOV_USERGUID
        assert response_data['authorizationId'] == HTTP_SM_UNIVERSALID.lower()
        assert response_data['email'] == HTTP_SMGOV_USEREMAIL
        assert response_data['displayName'] == HTTP_SMGOV_USERDISPLAYNAME

    def test_create_fail(self):
        credit_trades = self.test_data_fail

        for tests in credit_trades:
            response = self.client.post(self.test_url,
                                        content_type='application/json',
                                        data=json.dumps(tests['data']))

            self.assertJSONEqual(response.content.decode("utf-8"),
                                 tests['response'])
            assert response.status_code == status.HTTP_400_BAD_REQUEST

    def test_create_success(self):
        credit_trades = self.test_data_success

        for tests in credit_trades:
            response = self.client.post(self.test_url,
                                        content_type='application/json',
                                        data=json.dumps(tests['data']))

            assert status.HTTP_201_CREATED == response.status_code

    def test_create_and_create_trade_history(self):
        credit_trades = self.test_data_success

        for tests in credit_trades:
            response = self.client.post(self.test_url,
                                        content_type='application/json',
                                        data=json.dumps(tests['data']))

            ct_id = response.data['id']
            response = self.client.get("{}/{}/history".format(
                self.test_url, ct_id),
                                       content_type='application/json')

            assert status.HTTP_200_OK == response.status_code

    def test_update(self, **kwargs):
        credit_trade_id = kwargs.get("credit_trade_id",
                                     self.credit_trade['id'])
        num_of_credits = kwargs.get("num_of_credits", 4)
        credit_trade_status = kwargs.get("credit_trade_status", STATUS_DRAFT)
        fair_market_value = kwargs.get("fair_market_value", 1)
        #
        # if not credit_trade_id:
        #     credit_trade_id = self.credit_trade_id

        data = {
            'number_of_credits': num_of_credits,
            'status': credit_trade_status,
            'initiator': 2,
            'respondent': self.fs1_id,
            'type': self.ct_type_id,
            'fair_market_value_per_credit': fair_market_value
        }

        response = self.client.put("{}/{}".format(self.test_url,
                                                  credit_trade_id),
                                   content_type='application/json',
                                   data=json.dumps(data))

        assert status.HTTP_200_OK == response.status_code

    def test_update_create_trade_history(self):
        self.test_update(num_of_credits=1)
        self.test_update(num_of_credits=2)

        response = self.client.get("{}/{}/history".format(
            self.test_url, self.credit_trade['id']),
                                   content_type='application/json')

        response_data = json.loads(response.content.decode("utf-8"))

        self.assertEqual(3, len(response_data))

        assert status.HTTP_200_OK == response.status_code

    # TODO: possibly move the next set of tests to another file;
    # They test the business logic & not the API itself.
    def test_is_internal_history_false(self):
        self.test_update(credit_trade_status=STATUS_SUBMITTED)

        data = {
            'number_of_credits': 4,
            'status': STATUS_ACCEPTED,
            'initiator': 2,
            'respondent': self.fs1_id,
            'type': self.ct_type_id,
            'fair_market_value_per_credit': 1
        }

        response = self.respondent_client.put("{}/{}".format(
            self.test_url, self.credit_trade['id']),
                                              content_type='application/json',
                                              data=json.dumps(data))

        # self.test_update(credit_trade_status=STATUS_ACCEPTED)
        # TODO: Change this to /id/propose and /id/accept
        response = self.client.get("{}/{}/history".format(
            self.test_url, self.credit_trade['id']),
                                   content_type='application/json')
        response_data = json.loads(response.content.decode("utf-8"))
        self.assertFalse(response_data[0]['isInternalHistoryRecord'])

    def test_is_internal_history_draft(self):
        # Initially created credit trade is "Draft"
        response = self.client.get("{}/{}/history".format(
            self.test_url, self.credit_trade['id']),
                                   content_type='application/json')

        response_data = json.loads(response.content.decode("utf-8"))
        self.assertTrue(response_data[0]['isInternalHistoryRecord'])

    def test_is_internal_history_draft_then_cancelled(self):
        # Initially created credit trade is "Draft"

        # Update the status to "Cancelled"
        self.test_update(credit_trade_status=STATUS_CANCELLED)

        credit_trade = CreditTrade.objects.get(id=self.credit_trade['id'])
        self.assertEqual(credit_trade.status_id, STATUS_CANCELLED)

    def test_nested_credit_trade(self):
        response = self.client.get("{}/{}".format(self.test_url,
                                                  self.credit_trade['id']),
                                   content_type='application/json')
        response_data = json.loads(response.content.decode("utf-8"))

        credit_trade_status = {"id": STATUS_DRAFT, "status": "Draft"}
        self.assertTrue(
            set(credit_trade_status).issubset(response_data['status']))

    def test_nested_credit_trade_history(self):
        response = self.client.get("{}/{}/history".format(
            self.test_url, self.credit_trade['id']),
                                   content_type='application/json')
        response_data = json.loads(response.content.decode("utf-8"))[0]

        credit_trade_status = {"id": STATUS_DRAFT, "status": "Draft"}
        self.assertTrue(
            set(credit_trade_status).issubset(response_data['status']))

    def test_get_fuel_suppliers_only(self):
        response_data = fake_api_calls.get_fuel_suppliers()
        for r in response_data:
            assert r['type'] == 2

    def test_approved_buy(self, **kwargs):
        # get fuel supplier balance for fs 1
        initiator_bal = fake_api_calls.get_organization_balance(id=2)
        respondent_bal, created = OrganizationBalance.objects.get_or_create(
            organization_id=self.fs1_id,
            expiration_date=None,
            defaults={'validated_credits': 10000})

        num_of_credits = 50

        credit_trade = fake_api_calls.create_credit_trade(
            user_id=self.user_id,
            status=STATUS_SUBMITTED,
            fair_market_value_per_credit=1000,
            initiator=2,
            respondent=self.fs1_id,
            number_of_credits=num_of_credits,
            type=2)

        data = {
            'number_of_credits': num_of_credits,
            'status': STATUS_ACCEPTED,
            'initiator': 2,
            'respondent': self.fs1_id,
            'type': 2,
            'fair_market_value_per_credit': 1000
        }

        resp_user = User.objects.get(id=self.user_id)
        resp_user.organization_id = self.fs1_id
        resp_user.save()

        response = self.respondent_client.put("{}/{}".format(
            self.test_url, credit_trade['id']),
                                              content_type='application/json',
                                              data=json.dumps(data))

        response = self.gov_client.put("{}/{}/approve".format(
            self.test_url, credit_trade['id']),
                                       content_type='application/json')

        assert status.HTTP_200_OK == response.status_code

        # TODO: Make sure two credit histories are created

        initiator_bal_after = fake_api_calls.get_organization_balance(id=2)
        respondent_bal_after = fake_api_calls.get_organization_balance(
            id=self.fs1_id)

        init_final_bal = initiator_bal['validatedCredits'] + num_of_credits
        resp_final_bal = respondent_bal.validated_credits - num_of_credits

        ct_completed = self.client.get("{}/{}".format(self.test_url,
                                                      credit_trade['id']),
                                       content_type='application/json')

        completed_response = json.loads(ct_completed.content.decode("utf-8"))

        # response_data should have status == completed
        today = datetime.datetime.today().strftime('%Y-%m-%d')

        # Status of Credit Trade should be 'completed'
        self.assertEqual(completed_response['status']['id'], STATUS_COMPLETED)

        # Effective date should be today
        self.assertEqual(initiator_bal_after['effectiveDate'], today)
        self.assertEqual(respondent_bal_after['effectiveDate'], today)

        # Credits should be subtracted/added
        self.assertEqual(init_final_bal,
                         initiator_bal_after['validatedCredits'])
        self.assertEqual(resp_final_bal,
                         respondent_bal_after['validatedCredits'])

    def test_approved_sell(self, **kwargs):
        pass

    def test_approved_credit_validation(self, **kwargs):
        pass

    def test_approved_retirement(self, **kwargs):
        pass

    def test_approved_part_3_award(self, **kwargs):
        pass

        #
        # def test_director_approved(self):
        #     """Execute and complete a trade when an "On Director's Approval" Trade
        #     is approved"""
        #     tests = [{
        #         'data': {
        #             'credit_trade_status': STATUS_APPROVED,
        #             'number_of_credits': 2
        #         },
        #         'response': {
        #             ''
        #         }
        #     }, {
        #         'data': {
        #             'credit_trade_status': STATUS_DRAFT,
        #             'number_of_credits': 10,
        #             'fair_market_value': "Value"
        #         },
        #         'response': {
        #             ''
        #         }
        #     }]
        #     for test in tests:
        #         self.test_update(**test['data'])

        # self.test_update(credit_trade_status=STATUS_APPROVED)
        """Test that no other fields are changed, except for notes, 
        effective date & status"""

        # don't care where it comes from (ignore previous status)
        # status is "Approved"
        # no other fields can change, unless from getting a new note

        # effective date is None or past
        # Set effective date on director's approval

        # fuel supplier receives credits
        # fuel supplier loses credits
        # OrganizationBalance record created, effective data = transaction create time
        #   end data is None

        # pass

    # Test transitions of statuses
    def test_create_draft_or_proposed(self, **kwargs):
        credit_trades = [{
            'numberOfCredits': 1,
            'status': STATUS_DRAFT,
            'initiator': 2,
            'respondent': self.fs1_id,
            'type': self.ct_type_id
        }, {
            'numberOfCredits': 1,
            'status': STATUS_SUBMITTED,
            'initiator': 2,
            'respondent': self.fs1_id,
            'type': self.ct_type_id
        }]

        for ct in credit_trades:
            response = fake_api_calls.create_credit_trade_dict(ct)
            assert status.HTTP_201_CREATED == response.status_code

            # Make sure action statuses are "Draft" and "Submitted"
            # And Button actions are "Save as Draft" and "Propose"
            new_ct = fake_api_calls.get_credit_trade(response.json()['id'])
            if ct['status'] == STATUS_DRAFT:
                statuses = [a['status'] for a in new_ct.json()['actions']]
                actions = [a['action'] for a in new_ct.json()['actions']]

                assert sorted(["Draft", "Submitted"]) == sorted(statuses)
                assert sorted(["Save Draft", "Propose"]) == sorted(actions)

    def test_create_other_statuses_fail(self, **kwargs):
        credit_trades = [{
            'data': {
                'numberOfCredits': 1,
                'status': STATUS_ACCEPTED,
                'respondent': self.fs1_id,
                'type': self.ct_type_id
            },
            'error': {
                "invalidStatus": [
                    "You do not have permission to set"
                    " statuses to `Accepted`."
                ]
            }
        }, {
            'data': {
                'numberOfCredits': 1,
                'status': STATUS_RECOMMENDED,
                'respondent': self.fs1_id,
                'type': self.ct_type_id
            },
            'error': {
                "invalidStatus": [
                    "You do not have permission to set"
                    " statuses to `Recommended`."
                ]
            }
        }, {
            'data': {
                'numberOfCredits': 1,
                'status': STATUS_APPROVED,
                'respondent': self.fs1_id,
                'type': self.ct_type_id
            },
            'error': {
                "invalidStatus": [
                    "You do not have permission to set"
                    " statuses to `Approved`."
                ]
            }
        }, {
            'data': {
                'numberOfCredits': 1,
                'status': STATUS_COMPLETED,
                'respondent': self.fs1_id,
                'type': self.ct_type_id
            },
            'error': {
                "invalidStatus": [
                    "You do not have permission to set"
                    " statuses to `Completed`."
                ]
            }
        }, {
            'data': {
                'numberOfCredits': 1,
                'status': STATUS_CANCELLED,
                'respondent': self.fs1_id,
                'type': self.ct_type_id
            },
            'error': {
                "invalidStatus": [
                    "You do not have permission to set"
                    " statuses to `Cancelled`."
                ]
            }
        }, {
            'data': {
                'numberOfCredits': 1,
                'status': STATUS_DECLINED,
                'respondent': self.fs1_id,
                'type': self.ct_type_id
            },
            'error': {
                "invalidStatus": [
                    "You do not have permission to set"
                    " statuses to `Declined`."
                ]
            }
        }]

        for tests in credit_trades:
            response = fake_api_calls.create_credit_trade_dict(tests['data'])
            self.assertJSONEqual(response.content.decode("utf-8"),
                                 tests['error'])
            assert response.status_code == status.HTTP_400_BAD_REQUEST

    def test_update_draft_to_proposed_success(self, **kwargs):
        credit_trades = [{
            'numberOfCredits': 1,
            'status': STATUS_DRAFT,
            'initiator': 2,
            'respondent': self.fs1_id,
            'type': self.ct_type_id
        }, {
            'numberOfCredits': 5,
            'status': STATUS_DRAFT,
            'initiator': 2,
            'respondent': self.fs1_id,
            'type': self.ct_type_id
        }]

        self.test_create_success()
        for ct in credit_trades:
            # Create
            response = fake_api_calls.create_credit_trade_dict(ct)
            assert status.HTTP_201_CREATED == response.status_code

            # Update
            ct['status'] = STATUS_SUBMITTED
            updated_response = fake_api_calls.update_credit_trade_dict(
                ct,
                response.json()['id'])

            assert status.HTTP_200_OK == updated_response.status_code

    def test_update_proposed_to_accepted(self, **kwargs):
        pass

    def test_update_proposed_to_rescinded(self, **kwargs):
        pass

    def test_update_proposed_to_refused(self, **kwargs):
        pass

    def test_update_accepted_to_rescinded(self, **kwargs):
        pass

    def test_update_accepted_to_recommended(self, **kwargs):
        pass

    def test_update_accepted_to_approved(self, **kwargs):
        pass

    def test_update_accepted_to_declined(self, **kwargs):
        pass
Example #43
0
class TestEmployeeViews(TestCase):
    def setUp(self):
        self.client = Client()
        self.register_url = reverse('register')
        self.details_url = reverse('details')
        self.edit_url = reverse('edit')
        self.employeeEdit_url = reverse('employeeEdit')
        self.update_url = reverse('update')
        self.employeeUpdate_url = reverse('employeeUpdate')

    def create_emp(self):
        return empTable.objects.create(name="test name",
                                       address="test,, address",
                                       phone=123,
                                       email="test@email",
                                       designation="null",
                                       password=123)

    def test_register_GET(self):
        response = self.client.get(self.register_url)
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'EmployeeRegistration.html')

    def test_register_POST(self):
        response = self.client.post(
            self.register_url, {
                'name': 'test name',
                'address': 'test,, address',
                'phone': 123,
                'email': 'test@email',
                'designation': 'null'
            })
        self.assertEqual(response.status_code, 302)

    def test_register_address_validation_POST(self):
        response = self.client.post(
            self.register_url, {
                'name': 'test name',
                'address': 'test, address',
                'phone': 123,
                'email': 'test@email',
                'designation': 'null'
            })
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'EmployeeRegistration.html')

    def test_register_name_validation_POST(self):
        response = self.client.post(
            self.register_url, {
                'name': 'test',
                'address': 'test,, address',
                'phone': 123,
                'email': 'test@email',
                'designation': 'null'
            })
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'EmployeeRegistration.html')

    def test_details(self):
        response = self.client.get(self.details_url)
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'Details.html')

    def test_edit(self):
        emp = self.create_emp()
        response = self.client.post(self.edit_url, {'id': emp.id})
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'Update.html')

    def test_employeeEdit(self):
        emp = self.create_emp()
        response = self.client.post(self.employeeEdit_url, {'id': emp.id})
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'EmployeeUpdate.html')

    def test_update(self):
        emp = self.create_emp()
        response = self.client.post(
            self.update_url, {
                'id': emp.id,
                'name': 'test name',
                'address': 'test,, address',
                'phone': 123,
                'email': 'test@email',
                'designation': 'null'
            })
        self.assertEqual(response.status_code, 302)

    def test_update_address_validation(self):
        emp = self.create_emp()
        response = self.client.post(
            self.update_url, {
                'id': emp.id,
                'name': 'test name',
                'address': 'test, address',
                'phone': 123,
                'email': 'test@email',
                'designation': 'null'
            })
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'Update.html')

    def test_update_name_validation(self):
        emp = self.create_emp()
        response = self.client.post(
            self.update_url, {
                'id': emp.id,
                'name': 'test',
                'address': 'test,, address',
                'phone': 123,
                'email': 'test@email',
                'designation': 'null'
            })
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'Update.html')

    def test_employeeUpdate(self):
        emp = self.create_emp()
        response = self.client.post(
            self.employeeUpdate_url, {
                'id': emp.id,
                'name': 'test name',
                'address': 'test,, address',
                'phone': 123,
                'email': 'test@email',
            })
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'EmployeeProfile.html')

    def test_employeeUpdate_address_validation(self):
        emp = self.create_emp()
        response = self.client.post(
            self.employeeUpdate_url, {
                'id': emp.id,
                'name': 'test name',
                'address': 'test, address',
                'phone': 123,
                'email': 'test@email',
            })
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'EmployeeUpdate.html')

    def test_employeeUpdate_name_validation(self):
        emp = self.create_emp()
        response = self.client.post(
            self.employeeUpdate_url, {
                'id': emp.id,
                'name': 'test',
                'address': 'test,, address',
                'phone': 123,
                'email': 'test@email',
            })
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'EmployeeUpdate.html')
class FilterDataUser(TestCase):
    """
    This class tests on filter_data API requests made by authenticated users
    :return:
    """

    def setUp(self):
        self.client = Client()
        User.objects.create_user(
            username="******",
            password="******"
        )
        user = User.objects.get(username="******")
        response = self.client.post(
            "/api/token/",
            {
                "username": "******",
                "password": "******"
            },
            content_type="application/json"
        )
        self.access_token = response.data["access"]

        Config.objects.create(
            name=f"CoronaCases",
            heading="heading",
            description="desc",
            user=user,
            filters=json.dumps(SF[0])
        )
        config = Config.objects.get(user=user, name="CoronaCases")
        file_path = "source.json"
        file = open(file_path, 'r')
        convert_schema(config, file, DB_FORMAT_TYPES['TYPE_ZERO'])

    def test_response(self):
        """
        This method tests the output of the API against a dummy response file after populating
        the DB with tuples obtained from randomly splitting the "filter" object (function used: utils.dummyDataDefault)
        :return:
        """
        response = self.client.get(
            "/api/visualization/filter_data/",
            {
                "isDefault": "false",
                "model": "CoronaCases",
                "filters": PF[0]
            },
            **{"HTTP_AUTHORIZATION": f"JWT " + self.access_token},
            content_type="application/json"
        )
        self.assertEqual(response.status_code, 200)

        to_comp = json.load(open("response.json"))

        self.assertCountEqual(response.data[Data], to_comp)

    def test_format(self):
        """
        This method tests the output of format of the API response.
        :return:
        """
        response = self.client.get(
            "/api/visualization/filter_data/",
            {
                "isDefault": "false",
                "model": "CoronaCases",
                "filters": PF[0][:2]
            },
            **{"HTTP_AUTHORIZATION": f"JWT " + self.access_token},
            content_type="application/json"
        )
        self.assertEqual(response.status_code, 200)

        self.assertEqual(response.data[primaryFilters], PF[0][:2])

        self.assertTrue(response.data[Data])

    def test_anonymousUserAccess(self):
        """
        This method tests whether an anonymous user can access a user's resources
        :return:
        """
        self.client = Client()
        response = self.client.get(
            "/api/visualization/filter_data/",
            {
                "isDefault": "false",
                "model": "CoronaCases",
                "filters": PF[0][:2]
            }
        )
        self.assertEqual(response.status_code, 400)
Example #45
0
class TestTournament(TestCase):

    def setUp(self):
        self.client = Client()

    def test_create_tournament(self):
        res = self.client.post(
            '/api/tournament/',
            {
                'name': 'Tournament',
                'players': [
                    {'name': f'Player {n}'}
                    for n in range(1, 9)
                ],
                'game_size': 4,
                'game_cups': 2,
                'game_races': 4,
            },
            content_type='application/json',
        )

        self.assertEqual(res.status_code, 200)
        assert_valid(res.content, is_decodable_json_where({
            'name': 'Tournament',
            'token': is_str,
            'admin_token': is_str,
            'players': is_list_of({
                'id': is_int,
                'name': is_str,
            }),
            'games': is_list_of({
                'name': is_str,
                'round': is_int,
                'state': is_in({'waiting', 'active', 'done'}),
                'players': is_list_of(is_dict_union(
                    player={
                        'player': is_int,
                    },
                    slot={
                        'game': is_str,
                        'position': is_in({1, 2, 3, 4}),
                        'player': None,
                    },
                )),
                'cups': is_list_of(
                    is_list_of({
                        'player': is_int,
                        'races': is_list_of(is_nullable(is_int)),
                        'points': is_int,
                        'rank': is_in({1, 2, 3, 4}),
                        'fag_points': is_int,
                        'f*g': is_bool,
                    }),
                ),
                'total': is_list_of({
                    'player': is_int,
                    'points': is_int,
                    'rank': is_in({1, 2, 3, 4}),
                }),
            }),
            'next_race': is_nullable({
                'game': is_str,
                'cup': is_int,
                'race': is_int,
            }),
            'ranks': is_list_of({
                'rank': is_in({1, 2, 3, 4, 5, 6, 7, 8}),
                'game': is_str,
                'position': is_in({1, 2, 3, 4}),
                'player': None,
            }),
        }))

    def test_perform_tournament(self):
        tournament = Tournament.objects.create(
            name='Tournament',
            game_size=4,
            game_cups=2,
            game_races=4,
        )
        for n in range(1, 5):
            Player.objects.create(
                tournament=tournament,
                number=n,
                name=f'Player {n}',
            )
        schedule(tournament, shuffle=False)

        url = f'/api/tournament/{tournament.admin_token}/'

        def assert_tournament_state(
            content, cups, total, next_race, ranks, state='active',
        ):
            assert_valid(content, is_decodable_json_where({
                'name': 'Tournament',
                'token': is_str,
                'admin_token': is_str,
                'players': [
                    {'id': 1, 'name': 'Player 1'},
                    {'id': 2, 'name': 'Player 2'},
                    {'id': 3, 'name': 'Player 3'},
                    {'id': 4, 'name': 'Player 4'},
                ],
                'games': [{
                    'name': 'A',
                    'round': 1,
                    'state': state,
                    'players': [
                        {'type': 'player', 'player': 1},
                        {'type': 'player', 'player': 2},
                        {'type': 'player', 'player': 3},
                        {'type': 'player', 'player': 4},
                    ],
                    'cups': cups,
                    'total': total,
                }],
                'next_race': next_race,
                'ranks': ranks,
            }))

        res = self.client.get(url)
        self.assertEqual(res.status_code, 200)
        assert_tournament_state(
            res.content,
            cups=[
                [
                    {
                        'player': 0,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 1,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 2,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 3,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                ],
                [
                    {
                        'player': 0,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 1,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 2,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 3,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                ],
            ],
            total=[
                {'player': 0, 'points': 0, 'rank': 1},
                {'player': 1, 'points': 0, 'rank': 2},
                {'player': 2, 'points': 0, 'rank': 3},
                {'player': 3, 'points': 0, 'rank': 4},
            ],
            next_race={'game': 'A', 'cup': 1, 'race': 1},
            ranks=[
                {'rank': 1, 'game': 'A', 'position': 1, 'player': None},
                {'rank': 2, 'game': 'A', 'position': 2, 'player': None},
                {'rank': 3, 'game': 'A', 'position': 3, 'player': None},
                {'rank': 4, 'game': 'A', 'position': 4, 'player': None},
            ],
        )

        res = self.client.post(
            url,
            data={
                'game': 'A',
                'cup': 1,
                'race': 1,
                'positions': [1, 2, 3, 4],
            },
            content_type='application/json',
        )
        self.assertEqual(res.status_code, 200)
        assert_tournament_state(
            res.content,
            cups=[
                [
                    {
                        'player': 0,
                        'races': [1, None, None, None],
                        'points': 15,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 1,
                        'races': [2, None, None, None],
                        'points': 12,
                        'rank': 2,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 2,
                        'races': [3, None, None, None],
                        'points': 10,
                        'rank': 3,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 3,
                        'races': [4, None, None, None],
                        'points': 8,
                        'rank': 4,
                        'fag_points': 1,
                        'f*g': True,
                    },
                ],
                [
                    {
                        'player': 0,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 1,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 2,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 3,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                ],
            ],
            total=[
                {'player': 0, 'points': 15, 'rank': 1},
                {'player': 1, 'points': 12, 'rank': 2},
                {'player': 2, 'points': 10, 'rank': 3},
                {'player': 3, 'points': 8, 'rank': 4},
            ],
            next_race={'game': 'A', 'cup': 1, 'race': 2},
            ranks=[
                {'rank': 1, 'game': 'A', 'position': 1, 'player': None},
                {'rank': 2, 'game': 'A', 'position': 2, 'player': None},
                {'rank': 3, 'game': 'A', 'position': 3, 'player': None},
                {'rank': 4, 'game': 'A', 'position': 4, 'player': None},
            ],
        )

        res = self.client.post(
            url,
            data={
                'game': 'A',
                'cup': 1,
                'race': 2,
                'positions': [12, 11, 10, 9],
            },
            content_type='application/json',
        )
        self.assertEqual(res.status_code, 200)
        assert_tournament_state(
            res.content,
            cups=[
                [
                    {
                        'player': 0,
                        'races': [1, 12, None, None],
                        'points': 15,
                        'rank': 1,
                        'fag_points': 1,
                        'f*g': True,
                    },
                    {
                        'player': 1,
                        'races': [2, 11, None, None],
                        'points': 13,
                        'rank': 2,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 2,
                        'races': [3, 10, None, None],
                        'points': 12,
                        'rank': 3,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 3,
                        'races': [4, 9, None, None],
                        'points': 11,
                        'rank': 4,
                        'fag_points': 1,
                        'f*g': True,
                    },
                ],
                [
                    {
                        'player': 0,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 1,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 2,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 3,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                ],
            ],
            total=[
                {'player': 0, 'points': 15, 'rank': 1},
                {'player': 1, 'points': 13, 'rank': 2},
                {'player': 2, 'points': 12, 'rank': 3},
                {'player': 3, 'points': 11, 'rank': 4},
            ],
            next_race={'game': 'A', 'cup': 1, 'race': 3},
            ranks=[
                {'rank': 1, 'game': 'A', 'position': 1, 'player': None},
                {'rank': 2, 'game': 'A', 'position': 2, 'player': None},
                {'rank': 3, 'game': 'A', 'position': 3, 'player': None},
                {'rank': 4, 'game': 'A', 'position': 4, 'player': None},
            ],
        )

        res = self.client.post(
            url,
            data={
                'game': 'A',
                'cup': 1,
                'race': 3,
                'positions': [8, 1, 11, 4],
            },
            content_type='application/json',
        )
        self.assertEqual(res.status_code, 200)
        assert_tournament_state(
            res.content,
            cups=[
                [
                    {
                        'player': 1,
                        'races': [2, 11, 1, None],
                        'points': 28,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 0,
                        'races': [1, 12, 8, None],
                        'points': 19,
                        'rank': 2,
                        'fag_points': 1,
                        'f*g': True,
                    },
                    {
                        'player': 3,
                        'races': [4, 9, 4, None],
                        'points': 19,
                        'rank': 2,
                        'fag_points': 1,
                        'f*g': True,
                    },
                    {
                        'player': 2,
                        'races': [3, 10, 11, None],
                        'points': 13,
                        'rank': 4,
                        'fag_points': 1,
                        'f*g': True,
                    },
                ],
                [
                    {
                        'player': 0,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 1,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 2,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 3,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                ],
            ],
            total=[
                {'player': 1, 'points': 28, 'rank': 1},
                {'player': 0, 'points': 19, 'rank': 2},
                {'player': 3, 'points': 19, 'rank': 3},
                {'player': 2, 'points': 13, 'rank': 4},
            ],
            next_race={'game': 'A', 'cup': 1, 'race': 4},
            ranks=[
                {'rank': 1, 'game': 'A', 'position': 1, 'player': None},
                {'rank': 2, 'game': 'A', 'position': 2, 'player': None},
                {'rank': 3, 'game': 'A', 'position': 3, 'player': None},
                {'rank': 4, 'game': 'A', 'position': 4, 'player': None},
            ],
        )

        res = self.client.post(
            url,
            data={
                'game': 'A',
                'cup': 1,
                'race': 4,
                'positions': [2, 5, 10, 3],
            },
            content_type='application/json',
        )
        self.assertEqual(res.status_code, 200)
        assert_tournament_state(
            res.content,
            cups=[
                [
                    {
                        'player': 1,
                        'races': [2, 11, 1, 5],
                        'points': 35,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 0,
                        'races': [1, 12, 8, 2],
                        'points': 31,
                        'rank': 2,
                        'fag_points': 1,
                        'f*g': False,
                    },
                    {
                        'player': 3,
                        'races': [4, 9, 4, 3],
                        'points': 29,
                        'rank': 3,
                        'fag_points': 1,
                        'f*g': False,
                    },
                    {
                        'player': 2,
                        'races': [3, 10, 11, 10],
                        'points': 15,
                        'rank': 4,
                        'fag_points': 3,
                        'f*g': True,
                    },
                ],
                [
                    {
                        'player': 0,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 1,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 2,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 3,
                        'races': [None, None, None, None],
                        'points': 0,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                ],
            ],
            total=[
                {'player': 1, 'points': 180 + 35, 'rank': 1},
                {'player': 0, 'points': 120 + 31, 'rank': 2},
                {'player': 3, 'points': 60 + 29, 'rank': 3},
                {'player': 2, 'points': 0 + 15, 'rank': 4},
            ],
            next_race={'game': 'A', 'cup': 2, 'race': 1},
            ranks=[
                {'rank': 1, 'game': 'A', 'position': 1, 'player': None},
                {'rank': 2, 'game': 'A', 'position': 2, 'player': None},
                {'rank': 3, 'game': 'A', 'position': 3, 'player': None},
                {'rank': 4, 'game': 'A', 'position': 4, 'player': None},
            ],
        )

        res = self.client.post(
            url,
            data={
                'game': 'A',
                'cup': 2,
                'race': 1,
                'positions': [1, 5, 2, 3],
            },
            content_type='application/json',
        )
        self.assertEqual(res.status_code, 200)
        res = self.client.post(
            url,
            data={
                'game': 'A',
                'cup': 2,
                'race': 2,
                'positions': [5, 4, 1, 2],
            },
            content_type='application/json',
        )
        self.assertEqual(res.status_code, 200)
        res = self.client.post(
            url,
            data={
                'game': 'A',
                'cup': 2,
                'race': 3,
                'positions': [2, 1, 4, 5],
            },
            content_type='application/json',
        )
        self.assertEqual(res.status_code, 200)
        res = self.client.post(
            url,
            data={
                'game': 'A',
                'cup': 2,
                'race': 4,
                'positions': [2, 6, 3, 4],
            },
            content_type='application/json',
        )
        self.assertEqual(res.status_code, 200)
        assert_tournament_state(
            res.content,
            cups=[
                [
                    {
                        'player': 1,
                        'races': [2, 11, 1, 5],
                        'points': 35,
                        'rank': 1,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 0,
                        'races': [1, 12, 8, 2],
                        'points': 31,
                        'rank': 2,
                        'fag_points': 1,
                        'f*g': False,
                    },
                    {
                        'player': 3,
                        'races': [4, 9, 4, 3],
                        'points': 29,
                        'rank': 3,
                        'fag_points': 1,
                        'f*g': False,
                    },
                    {
                        'player': 2,
                        'races': [3, 10, 11, 10],
                        'points': 15,
                        'rank': 4,
                        'fag_points': 3,
                        'f*g': True,
                    },
                ],
                [
                    {
                        'player': 0,
                        'races': [1, 5, 2, 2],
                        'points': 46,
                        'rank': 1,
                        'fag_points': 1,
                        'f*g': False,
                    },
                    {
                        'player': 2,
                        'races': [2, 1, 4, 3],
                        'points': 45,
                        'rank': 2,
                        'fag_points': 0,
                        'f*g': False,
                    },
                    {
                        'player': 3,
                        'races': [3, 2, 5, 4],
                        'points': 37,
                        'rank': 3,
                        'fag_points': 1,
                        'f*g': False,
                    },
                    {
                        'player': 1,
                        'races': [5, 4, 1, 6],
                        'points': 36,
                        'rank': 4,
                        'fag_points': 3,
                        'f*g': True,
                    },
                ],
            ],
            total=[
                {'player': 0, 'points': 120 + 31 + 180 + 46, 'rank': 1},
                {'player': 1, 'points': 180 + 35 + 0 + 36, 'rank': 2},
                {'player': 3, 'points': 60 + 29 + 60 + 37, 'rank': 3},
                {'player': 2, 'points': 0 + 15 + 120 + 45, 'rank': 4},
            ],
            next_race=None,
            ranks=[
                {'rank': 1, 'game': 'A', 'position': 1, 'player': 1},
                {'rank': 2, 'game': 'A', 'position': 2, 'player': 2},
                {'rank': 3, 'game': 'A', 'position': 3, 'player': 4},
                {'rank': 4, 'game': 'A', 'position': 4, 'player': 3},
            ],
            state='done',
        )
Example #46
0
class TestNotifyUsersAboutChallenge(TestCase):
    def setUp(self):
        self.client = Client()

        self.superuser = User.objects.create_superuser('superuser',
                                                       "*****@*****.**",
                                                       'secret_password')

        self.user = User.objects.create(username='******',
                                        email="*****@*****.**",
                                        password='******')

        self.url = reverse_lazy('web:notify_users_about_challenge')

        self.email_data = {
            'subject': 'Subject of the Email',
            'body': 'Body of the Email'
        }

    def test_if_user_isnt_authenticated(self):
        response = self.client.get(self.url)
        html = response.content.decode('utf8')
        self.assertTrue(html.startswith('<!DOCTYPE html>'))
        self.assertTrue(html.endswith(''))
        self.assertEqual(response.status_code, 200)

    def test_if_user_is_authenticated_but_not_superuser(self):
        self.data = {
            'username': self.user.username,
            'password': self.user.password
        }
        response = self.client.post(self.url, self.data)
        html = response.content.decode('utf8')
        self.assertTrue(html.startswith('<!DOCTYPE html>'))
        self.assertTrue(html.endswith(''))
        self.assertEqual(response.status_code, 200)

    def test_if_user_is_authenticated_and_superuser(self):
        request = self.client.get('/admin/', follow=True)
        response = self.client.login(username='******',
                                     password='******')
        self.assertEqual(request.status_code, 200)
        self.assertTrue(response)

    def test_notification_email_data_page(self):
        request = self.client.get('/admin/', follow=True)
        response = self.client.login(username='******',
                                     password='******',
                                     follow=True)
        request = self.client.get(self.url)
        html = request.content.decode('utf8')
        self.assertTrue(html.startswith(''))
        self.assertTrue(html.endswith(''))
        self.assertEqual(request.status_code, 200)
        self.assertTrue(response)

    def test_notification_email_without_challenge_image(self):
        request = self.client.get('/admin/', follow=True)
        response = self.client.login(username='******',
                                     password='******',
                                     follow=True)
        request = self.client.post(self.url, self.email_data)
        html = request.content.decode('utf8')
        self.assertTrue(html.startswith(''))
        self.assertTrue(html.endswith(''))
        self.assertEqual(request.status_code, 200)
        self.assertTrue(response)

    def test_notification_email_with_challenge_image(self):
        request = self.client.get('/admin/', follow=True)
        response = self.client.login(username='******',
                                     password='******',
                                     follow=True)
        self.email_data['challenge_image'] = SimpleUploadedFile(
            name='test_background_image.jpg',
            content=open('frontend/src/images/rocket.png', 'rb').read(),
            content_type='image/jpg')
        request = self.client.post(self.url, self.email_data)
        html = request.content.decode('utf8')
        self.assertTrue(html.startswith(''))
        self.assertTrue(html.endswith(''))
        self.assertTrue(response)
        self.assertEqual(request.status_code, 200)

    def test_notification_with_put_request(self):
        request = self.client.get('/admin/', follow=True)
        response = self.client.login(username='******',
                                     password='******',
                                     follow=True)
        request = self.client.put(self.url, self.email_data)
        html = request.content.decode('utf8')
        self.assertTrue(html.startswith('<!DOCTYPE html>'))
        self.assertTrue(html.endswith(''))
        self.assertTrue(response)
        self.assertEqual(request.status_code, 200)
Example #47
0
class TestProfile(TestCase):
    def setUp(self):
        self.client = Client()

        self.user1 = User.objects.create(username='******',
                                         password='******',
                                         email='*****@*****.**')

        self.user2 = User.objects.create(username='******',
                                         email='*****@*****.**')

        self.user2.set_password('pass@123')
        self.user2.save()

        self.user2_profile = Profile.objects.create(
            user=self.user2,
            department='Computer Engineering',
            institute='ace',
            title='Doctor',
            position='instructor',
            phone_number='1122993388',
            location='mumbai',
            how_did_you_hear_about_us='Google',
            state='IN-MH',
            is_email_verified=1)

    def test_has_profile_for_user_without_profile(self):
        """
		If no profile exists for user passed as argument return False
		"""
        has_profile_status = has_profile(self.user1)
        self.assertFalse(has_profile_status)

    def test_has_profile_for_user_with_profile(self):
        """
		If profile exists for user passed as argument return True
		"""
        has_profile_status = has_profile(self.user2)
        self.assertTrue(has_profile_status)

    def test_view_profile_denies_anonymous(self):
        """
		If not logged in redirect to login page
		"""
        response = self.client.get(reverse(view_profile), follow=True)
        redirect_destination = '/login/?next=/view_profile/'
        self.assertTrue(response.status_code, 200)
        self.assertRedirects(response, redirect_destination)

    def test_edit_profile_get(self):
        """
		GET request to edit profile should display profile form
		"""

        self.client.login(username=self.user2, password='******')
        response = self.client.get(reverse(edit_profile))
        user_profile = User.objects.get(id=self.user2.id)
        profile = Profile.objects.get(user=user_profile)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(profile.institute, 'ace')
        self.client.logout()

    def test_edit_profile_post(self):

        self.client.login(username=self.user2, password='******')
        response = self.client.post(
            '/edit_profile/', {
                'first_name': 'demo_test',
                'last_name': 'user2',
                'institute': 'IIT',
                'department': 'aerospace engineering'
            })

        updated_profile_user = User.objects.get(id=self.user2.id)
        updated_profile = Profile.objects.get(user=updated_profile_user)
        self.assertEqual(updated_profile.institute, 'IIT')
        self.assertEqual(updated_profile.department, 'aerospace engineering')
        self.assertEqual(updated_profile.position, 'instructor')
        self.assertEqual(response.status_code, 200)
        # self.assertTemplateUsed(response, 'workshop_app/profile_updated.html')

    def test_register_page(self):
        self.client.get('/register/')
        self.register_response = self.client.post('/register/',
                                                  data={
                                                      'username': '******',
                                                      'email': '*****@*****.**',
                                                      'password': '******',
                                                      'confirm password':
                                                      '******',
                                                      'first name': 'testor',
                                                      'last name': 'user',
                                                      'phone number':
                                                      1234567890,
                                                      'institute': 'IIT',
                                                      'location': 'mumbai',
                                                      'state': (2),
                                                      'department': (2)
                                                  })

        self.assertEqual(self.register_response.status_code, 200)
Example #48
0
class TestStringMethods(TestCase):
    def setUp(self):
        cache.clear()
        self.client = Client()
        self.client_auth = Client()
        self.client_auth_fol = Client()
        self.client_not_auth = Client()
        self.user = User.objects.create_user(username="******",
                                             email="*****@*****.**",
                                             password="******")
        self.user_auth = User.objects.create_user(username="******",
                                                  email="*****@*****.**",
                                                  password="******")
        self.user_auth_fol = User.objects.create_user(
            username="******",
            email="*****@*****.**",
            password="******")
        self.group = Group.objects.create(
            title="terminator",
            slug="film",
            description="1984, science fiction, action")
        self.client.force_login(self.user)

    def test_profile(self):
        response = self.client.get(
            reverse('profile', kwargs={"username": self.user.username}))
        self.assertEqual(response.status_code, 200)

    def test_create_post(self):
        response = self.client.get(
            reverse('profile', kwargs={"username": self.user.username}))
        self.assertEqual(len(response.context["page"]), 0)
        response_create = self.client.post(reverse('new_post'), {
            "text": "new post",
            "group": self.group.id
        },
                                           follow=True)
        self.assertRedirects(response_create, reverse('index'))
        response_prof = self.client.get(
            reverse('profile', kwargs={"username": self.user.username}))
        self.assertEqual(len(response_prof.context["page"]), 1)
        self.post = Post.objects.get(id=1)
        self.assertEqual(self.post.text, "new post")
        self.assertEqual(self.post.author, self.user)
        self.assertEqual(self.post.group, self.group)

    def test_guest(self):
        response_new = self.client_not_auth.get(reverse('new_post'),
                                                follow=True)
        self.assertRedirects(response_new,
                             f"{reverse('login')}?next={reverse('new_post')}")
        self.assertEqual(Post.objects.count(), 0)

    def test_new_post(self):
        newpost = Post.objects.create(text="New test post", author=self.user)
        self.url_list = (reverse('index'),
                         reverse('profile',
                                 kwargs={"username": self.user.username}),
                         reverse('post',
                                 kwargs={
                                     "username": self.user.username,
                                     "post_id": newpost.id,
                                 }))
        for url in self.url_list:
            with self.subTest(url=url):
                response = self.client.get(url)
                self.assertContains(response, newpost.text)

    def test_change_post(self):
        self.post = Post.objects.create(text="Its driving me crazy!",
                                        author=self.user,
                                        group=self.group)
        post = Post.objects.get(author=self.user.id)
        response = self.client.post(reverse('post_edit',
                                            kwargs={
                                                'username': self.user.username,
                                                'post_id': self.post.id
                                            }), {
                                                'text': 'New post text',
                                                'author': self.user.id
                                            },
                                    follow=False)
        post_new = Post.objects.get(author=self.user.id)
        self.url_list = (reverse('index'),
                         reverse('profile',
                                 kwargs={"username": self.user.username}),
                         reverse('post',
                                 kwargs={
                                     "username": self.user.username,
                                     "post_id": post.id,
                                 }))
        for url in self.url_list:
            with self.subTest(url=url):
                response = self.client.get(url)
            self.assertContains(response, post_new.text)

    def test_404(self):
        response = self.client.get('/auth/test404')
        self.assertEqual(response.status_code, 404)

    def test_with_picture(self):
        small_gif = (
            b'\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x00\x00\x00\x21\xf9\x04'
            b'\x01\x0a\x00\x01\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02'
            b'\x02\x4c\x01\x00\x3b')
        img = SimpleUploadedFile(
            name='some.gif',
            content=small_gif,
            content_type='image/gif',
        )
        post = Post.objects.create(
            author=self.user,
            text='text',
            group=self.group,
            image=img,
        )
        urls = [
            reverse('index'),
            reverse('profile', kwargs={"username": self.user.username}),
            reverse('post',
                    kwargs={
                        "username": self.user.username,
                        "post_id": post.id,
                    }),
            reverse('group_posts', kwargs={'slug': post.group.slug}),
        ]
        for url in urls:
            with self.subTest(url=url):
                response = self.client.get(url)
                self.assertContains(response, '<img')
        post.image.delete()

    def test_without_picture(self):
        not_image = SimpleUploadedFile(
            name='some.txt',
            content=b'abc',
            content_type='text/plain',
        )

        url = reverse('new_post')
        response = self.client.post(url, {
            'text': 'some_text',
            'image': not_image
        })

        self.assertFormError(
            response,
            'form',
            'image',
            errors=('Загрузите правильное изображение. '
                    'Файл, который вы загрузили, поврежден '
                    'или не является изображением.'),
        )

    def test_cache(self):
        self.assertEqual(Post.objects.count(), 0)
        response = self.client.get(reverse('index'))
        self.post = Post.objects.create(text="Its driving me crazy!",
                                        author=self.user,
                                        group=self.group)
        self.assertEqual(Post.objects.count(), 1)
        response_new = self.client.get(reverse('index'))
        self.assertEqual(response.content, response_new.content)

    def test_folowing_auth_user(self):
        self.client_auth.force_login(self.user_auth)
        self.assertEqual(self.user.following.count(), 0)
        response = self.client_auth.post(
            reverse('profile_follow', kwargs={'username': self.user.username}))
        self.assertEqual(self.user.following.count(), 1)

    def test_unfollowing_auth_user(self):
        self.client_auth.force_login(self.user_auth)
        folowing = Follow.objects.create(user=self.user_auth, author=self.user)
        self.assertEqual(self.user.following.count(), 1)
        response = self.client_auth.post(
            reverse('profile_unfollow',
                    kwargs={'username': self.user.username}))
        self.assertEqual(self.user.following.count(), 0)

    def test_new_post_followers(self):
        self.client_auth_fol.force_login(self.user_auth_fol)
        folowing = Follow.objects.create(user=self.user_auth_fol,
                                         author=self.user)
        newpost = Post.objects.create(text="New test post", author=self.user)
        response_auth_fol = self.client_auth_fol.get(reverse('follow_index'))
        self.assertContains(response_auth_fol, newpost.text)

    def test_new_post_notfollowers(self):
        self.client_auth.force_login(self.user_auth)
        newpost = Post.objects.create(text="New test post", author=self.user)
        response_auth = self.client_auth.get(reverse('follow_index'))
        self.assertNotContains(response_auth, newpost.text)

    def test_auth_user_comment(self):
        self.post = Post.objects.create(
            text="Test post for comments",
            author=self.user,
        )
        post = Post.objects.get(author=self.user.id)
        self.client_auth.force_login(self.user_auth)
        self.assertEqual(Comment.objects.count(), 0)
        self.client_auth.post(reverse('add_comment',
                                      args=[post.author, post.id]),
                              {'text': 'new_comment'},
                              follow=True)
        self.assertEqual(Comment.objects.count(), 1)

    def test_notauth_user_comment(self):
        self.post = Post.objects.create(
            text="Test post for comments",
            author=self.user,
        )
        post = Post.objects.get(author=self.user.id)
        self.assertEqual(Comment.objects.count(), 0)
        self.client_not_auth.post(reverse('add_comment',
                                          args=[post.author, post.id]),
                                  {'text': 'new_comment_not_auth'},
                                  follow=True)
        self.assertEqual(Comment.objects.count(), 0)
Example #49
0
class UserTests(TestCase):

    def set_up(self):
        self.client = Client()

    def test_user_registration(self):
        """
        Tests the registration procedure.
        First we test invalid cases (when the passwords don't match), then we check that the User is created and the
        username correctly tokenized if the registration is successful.
        """
        alphabet = string.ascii_letters + string.digits + '@.+-_'
        username = ''.join(choice(alphabet) for _ in range(4))
        password1 = 'notagain'
        correct_password2 = password1
        data = {'username': username,
                'password1': password1,
                'password2': ''}
        endpoint = '/registration/'

        for _ in range(10):
            data['password2'] = token_bytes(16).decode('iso-8859-1')
            invalid_req = self.client.post(endpoint, data, follow=True)

            self.assertEqual(len(invalid_req.redirect_chain), 0)

        data['password2'] = correct_password2
        valid_req = self.client.post(endpoint, data, follow=True)

        self.assertEqual(len(valid_req.redirect_chain), 1)  # aka the redirect to /login/

        self.assertIsNotNone(User.objects.last())

        registered_user = User.objects.last()
        self.assertIn('-', registered_user.username)

        initials = get_user_token_initials(registered_user.username)
        self.assertEqual(initials, username)

    def test_user_login(self):
        """
        Tests user login and correct fernet token usage.
        """
        username = '******'
        user_token = create_user_token(username)
        password = '******'

        test_user = User.objects.create_user(username=user_token, password=password)

        self.assertEqual(test_user.username, user_token)
        self.assertTrue(argon2.verify(password, test_user.password[6:]))

        initials = get_user_token_initials(user_token)

        self.assertEqual(initials, username)

        self.assertIsNone(test_user.last_login)

        for _ in range(20):
            self.assertFalse(self.client.login(username=user_token, password=token_bytes(16).decode('iso-8859-1')))

        self.assertIsNone(test_user.last_login)

        self.assertTrue(self.client.login(username=user_token, password=password))

        test_user.last_login = datetime.now()
        self.assertIsNotNone(test_user.last_login)

        user_token_list = []

        for _ in range(20):
            # we enter the loop already logged-in

            if self.client.get('/vault/').status_code != 200:
                # we're logged out -> log in with the most recent pass token
                self.client.login(username=user_token, password=user_token_list[-1])
                test_user.last_login = datetime.now()

            pass_token = self.client.get('/token').context['password_token']
            self.assertTrue(pass_token)
            self.assertIsInstance(pass_token, str)

            user_token_list.append(pass_token)

            self.client.logout()
            self.assertEqual(self.client.get('/vault/').status_code, 302)

        self.assertEqual(len(user_token_list), 20)

        for pass_tk in user_token_list:
            if pass_tk == user_token_list[-1]:
                # we should only be able to login with the most recent token
                self.assertTrue(self.client.login(username=user_token, password=pass_tk))
            else:
                self.assertFalse(self.client.login(username=user_token, password=pass_tk))

    def test_user_deletion(self):
        """
        Tests user deletion (and the deletion of all associated data).
        """
        user = User.objects.create_user(username='******', password='******')

        self.assertNotEqual(User.objects.last(), None)

        for _ in range(4):
            Vault.objects.create(owner=user, app='testapp')

        self.assertEqual(Vault.objects.filter(owner=user).count(), 4)
        self.assertEqual(Nonce.objects.filter(user=user).count(), 1)

        user.delete()

        self.assertEqual(User.objects.last(), None)
        self.assertEqual(Vault.objects.filter(owner=user).exists(), False)
        self.assertEqual(Nonce.objects.filter(user=user).first(), None)
Example #50
0
class UpdateDisciplineTestCase(TestCase):
    """
    Test to update discipline by teacher.
    """
    def setUp(self):
        """
        This method will run before any test case.
        """

        self.client = Client()
        self.teacher1 = User.objects.create_user(username='******',
                                                 email='*****@*****.**',
                                                 password='******')
        self.teacher2 = User.objects.create_user(username='******',
                                                 email='*****@*****.**',
                                                 password='******')
        self.student = User.objects.create_user(username='******',
                                                email='*****@*****.**',
                                                password='******',
                                                is_teacher=False)
        self.discipline = Discipline.objects.create(
            title='Discipline01',
            description='Discipline description.',
            classroom='Class A',
            students_limit=59,
            monitors_limit=5,
            is_closed=True,
            teacher=self.teacher1,
            slug='discipline01')
        self.url = reverse_lazy('disciplines:update',
                                kwargs={'slug': self.discipline.slug})

    def tearDown(self):
        """
        This method will run after any test.
        """

        self.teacher1.delete()
        self.teacher2.delete()
        self.student.delete()
        self.discipline.delete()

    def test_update_discipline_ok(self):
        """
        Update the discipline by teacher successfully.
        """

        self.client.login(username=self.teacher1.username, password='******')
        data = {
            'title': 'Discipline modified',
            'description': 'Discipline description.',
            'classroom': 'Class A',
            'students_limit': 60,
            'monitors_limit': 5,
        }
        response = self.client.post(self.url, data, follow=True)
        profile_url = reverse_lazy('accounts:profile')
        self.assertRedirects(response, profile_url)
        self.discipline.refresh_from_db()
        self.assertEqual(self.discipline.title, 'Discipline modified')
        check_messages(self,
                       response,
                       tag='alert-success',
                       content='Discipline updated successfully.')

    def test_update_discipline_input_error(self):
        """
        Test to edit discipline without fields.
        """

        self.client.login(username=self.teacher1.username, password='******')
        data = {
            'title': '',
            'description': '',
            'classroom': '',
            'students_limit': 60,
            'monitors_limit': 5,
        }
        response = self.client.post(self.url, data, follow=True)
        self.assertFormError(response, 'form', 'title',
                             _("This field is required."))
        self.assertFormError(response, 'form', 'description',
                             _("This field is required."))
        self.assertFormError(response, 'form', 'classroom',
                             _("This field is required."))
        self.discipline.refresh_from_db()
        self.assertEqual(self.discipline.title, 'Discipline01')
        self.assertEqual(self.discipline.description,
                         'Discipline description.')
        self.assertEqual(self.discipline.classroom, 'Class A')

    def test_student_update_discipline(self):
        """
        Test to update discipline by student without success.
        """

        self.client.login(username=self.student.username, password='******')
        data = {
            'title': 'Discipline modified',
            'description': 'Discipline description.',
            'classroom': 'Class A',
            'students_limit': 60,
            'monitors_limit': 5,
        }
        response = self.client.post(self.url, data, follow=True)
        profile_url = reverse_lazy('accounts:profile')
        self.assertRedirects(response, profile_url)
        self.discipline.refresh_from_db()
        self.assertEqual(self.discipline.title, 'Discipline01')
        check_messages(self,
                       response,
                       tag='alert-danger',
                       content="You are not authorized to do this action.")

    def test_another_teacher_update_discipline(self):
        """
        Test specific teacher can't update disciplines created by another
        teacher.
        """

        self.client.login(username=self.teacher2.username, password='******')
        data = {
            'title': 'Discipline modified',
            'description': 'Discipline description.',
            'classroom': 'Class A',
            'students_limit': 60,
            'monitors_limit': 5,
        }
        response = self.client.post(self.url, data, follow=True)
        profile_url = reverse_lazy('accounts:profile')
        self.assertRedirects(response, profile_url)
        self.discipline.refresh_from_db()
        self.assertEqual(self.discipline.title, 'Discipline01')
        check_messages(self,
                       response,
                       tag='alert-danger',
                       content="You are not authorized to do this action.")

    def test_open_discipline_if_modify_students_limit(self):
        """
        If discipline is closed, open it if modify students limit.
        """

        self.client.login(username=self.teacher1.username, password='******')
        self.assertEqual(self.discipline.is_closed, True)
        data = {
            'title': 'Discipline modified',
            'description': 'Discipline description.',
            'classroom': 'Class A',
            'students_limit': 60,
            'monitors_limit': 5,
        }
        response = self.client.post(self.url, data, follow=True)
        profile_url = reverse_lazy('accounts:profile')
        self.assertRedirects(response, profile_url)
        self.discipline.refresh_from_db()
        self.assertEqual(self.discipline.title, 'Discipline modified')
        self.assertEqual(self.discipline.is_closed, False)
        check_messages(self,
                       response,
                       tag='alert-success',
                       content='Discipline updated successfully.')
Example #51
0
class PropertyTest(TestCase):
    def setUp(self):
        self.test_user = User.objects.get_or_create(user_name="test",
                                                    kakao_id=12345,
                                                    is_host=False)[0]

        def getToken(test_user):
            return jwt.encode({
                'id': test_user.id
            },
                              MINIBNB_SECRET_KEY,
                              algorithm='HS256').decode('UTF-8')

        self.encoded = getToken(self.test_user)
        self.client = Client()

    def test_property_create(self):

        multipart_data = {
            'property_name': '선릉 근처 근사한 숙소',
            'description': '머물기 정말 편한 숙소입니다.',
            'address1': '서울시 성북구',
            'address2': '',
            'postal': '12345',
            'max_people': '4',
            'price': '50000',
            'picture1': open('./property/tests/1234.png', 'rb'),
        }
        data = MultipartEncoder(multipart_data)

        response = self.client.post('/property/create',
                                    data=data.to_string(),
                                    **{
                                        'HTTP_AUTHORIZATION': self.encoded,
                                        'content_type': data.content_type
                                    })
        new_property = Property.objects.get(user__id=self.test_user.id)

        self.assertEqual(response.status_code, 200)
        self.assertEqual(Property.objects.count(), 1)

        self.test_user.is_host = True
        response = self.client.post('/property/create',
                                    data=data.to_string(),
                                    **{
                                        'HTTP_AUTHORIZATION': self.encoded,
                                        'content_type': data.content_type
                                    })
        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.json(), {'message': '숙소가 이미 존재합니다.'})

    def test_property_delete(self):

        multipart_data = {
            'property_name': '선릉 근처 근사한 숙소',
            'description': '머물기 정말 편한 숙소입니다.',
            'address1': '서울시 성북구',
            'address2': '',
            'postal': '12345',
            'max_people': '4',
            'price': '50000',
            'picture1': open('./property/tests/1234.png', 'rb'),
        }
        data = MultipartEncoder(multipart_data)

        response = self.client.post('/property/create',
                                    data=data.to_string(),
                                    **{
                                        'HTTP_AUTHORIZATION': self.encoded,
                                        'content_type': data.content_type
                                    })
        new_property = Property.objects.get(user__id=self.test_user.id)

        test_body = {'property_id': new_property.id}
        response = self.client.post(
            '/property/delete', json.dumps(test_body), **{
                'HTTP_AUTHORIZATION': self.encoded,
                'content_type': 'application/json'
            })

        self.assertEqual(response.status_code, 200)
        self.assertEqual(Property.objects.count(), 0)

    def tearDown(self):
        User.objects.get(user_name="test").delete()
Example #52
0
class TestCollection(MockIRODSTestCaseMixin, TransactionTestCase):

    def setUp(self):
        super(TestCollection, self).setUp()
        self.api_client = Client()
        self.group, _ = Group.objects.get_or_create(name='Hydroshare Author')

        self.user1 = create_account(
            '*****@*****.**',
            username='******',
            password='******',
            first_name='myfirstname1',
            last_name='mylastname1',
            superuser=False,
            groups=[self.group]
        )

        self.resCollection = create_resource(
            resource_type='CollectionResource',
            owner=self.user1,
            title='My Collection',
            keywords=['kw1', 'kw2'],
            metadata=[{"rights": {"statement": "mystatement", "url": "http://www.google.com"}},
                      {"description": {"abstract": "myabstract"}}
                      ]
        )

        self.resCollection_with_missing_metadata = create_resource(
            resource_type='CollectionResource',
            owner=self.user1,
            title='My Collection with missing required metadata'
        )

        self.resGen1 = create_resource(
            resource_type='GenericResource',
            owner=self.user1,
            title='Gen 1'
        )

        self.resGen2 = create_resource(
            resource_type='GenericResource',
            owner=self.user1,
            title='Gen 2'
        )

        self.resGen3 = create_resource(
            resource_type='GenericResource',
            owner=self.user1,
            title='Gen 3'
        )

        self.resGen4 = create_resource(
            resource_type='GenericResource',
            owner=self.user1,
            title='Gen 4'
        )

        self.resTimeSeries = create_resource(
            resource_type='TimeSeriesResource',
            owner=self.user1,
            title='Test Time Series Resource'
        )

        self.resNetCDF = create_resource(
                    resource_type='NetcdfResource',
                    owner=self.user1,
                    title='Test NetCDF Resource'
                )

        self.resGeoFeature = create_resource(
                    resource_type='GeographicFeatureResource',
                    owner=self.user1,
                    title='Test Geographic Feature (shapefiles)'
                )

        self.resModelInstance = create_resource(
                    resource_type='ModelInstanceResource',
                    owner=self.user1,
                    title='Test Model Instance Resource')

        self.user2 = create_account(
            '*****@*****.**',
            username='******',
            password='******',
            first_name='myfirstname2',
            last_name='mylastname2',
            superuser=False,
            groups=[self.group]
        )

        self.resGen5 = create_resource(
            resource_type='GenericResource',
            owner=self.user2,
            title='Gen 4'
        )

        base_url = "/hsapi/_internal/{0}"
        self.url_to_update_collection = base_url + "/update-collection/"
        self.url_to_collection_member_permission = base_url + "/collection-member-permission/{1}/"
        self.url_to_set_resource_flag = base_url + "/set-resource-flag/"
        self.url_to_delete_resource = base_url + "/delete-resource/"
        self.url_to_update_collection_for_deleted_resources = \
            base_url + "/update-collection-for-deleted-resources/"
        self.url_to_calculate_collection_coverages = \
            "/hsapi/_internal/calculate-collection-coverages/{0}/"

    def test_collection_basic_functions(self):
        # test basic collection class with different res types

        self.assertEqual(self.resCollection.resources.count(), 0)
        # add res to collection.resources
        self.resCollection.resources.add(self.resGen1)
        self.resCollection.resources.add(self.resGeoFeature)
        self.resModelInstance.collections.add(self.resCollection)
        self.resTimeSeries.collections.add(self.resCollection)

        # test count
        self.assertEqual(self.resCollection.resources.count(), 4)

        # test res in collection.resources
        self.assertIn(self.resGen1, self.resCollection.resources.all())
        self.assertIn(self.resGeoFeature, self.resCollection.resources.all())
        self.assertIn(self.resModelInstance, self.resCollection.resources.all())
        self.assertIn(self.resTimeSeries, self.resCollection.resources.all())

        # test collection in res.collections
        self.assertIn(self.resCollection, self.resGen1.collections.all())
        self.assertIn(self.resCollection, self.resGeoFeature.collections.all())
        self.assertIn(self.resCollection, self.resModelInstance.collections.all())
        self.assertIn(self.resCollection, self.resTimeSeries.collections.all())

        # test remove all res from collection.resources
        self.resCollection.resources.clear()
        self.assertEqual(self.resCollection.resources.count(), 0)

        # test collection NOT in res.collections
        self.assertNotIn(self.resCollection, self.resGen1.collections.all())
        self.assertNotIn(self.resCollection, self.resGeoFeature.collections.all())
        self.assertNotIn(self.resCollection, self.resModelInstance.collections.all())
        self.assertNotIn(self.resCollection, self.resTimeSeries.collections.all())

        # test adding same resources to multiple collection resources
        self.resCollection.resources.add(self.resGen1)
        self.resCollection.resources.add(self.resGeoFeature)
        self.resCollection_with_missing_metadata.resources.add(self.resGen1)
        self.resCollection_with_missing_metadata.resources.add(self.resGeoFeature)

        # test resources are in both collection resource
        self.assertIn(self.resGen1, self.resCollection.resources.all())
        self.assertIn(self.resGeoFeature, self.resCollection.resources.all())
        self.assertIn(self.resGen1, self.resCollection_with_missing_metadata.resources.all())
        self.assertIn(self.resGeoFeature, self.resCollection_with_missing_metadata.resources.all())

    def test_collection_deleted_resource(self):
        # test CollectionDeletedResource

        self.assertEqual(self.resCollection.deleted_resources.count(), 0)
        self.assertEqual(CollectionDeletedResource.objects.count(), 0)
        # create 2 CollectionDeletedResource obj and associate with collection
        CollectionDeletedResource.objects.create(resource_title=self.resGen1.
                                                 metadata.title,
                                                 deleted_by=self.user1,
                                                 collection=self.resCollection)
        CollectionDeletedResource.objects.create(resource_title=self.
                                                 resModelInstance.metadata.title,
                                                 deleted_by=self.user1,
                                                 collection=self.resCollection)

        self.assertEqual(CollectionDeletedResource.objects.count(), 2)
        self.assertEqual(self.resCollection.deleted_resources.count(), 2)
        self.assertEqual(self.resCollection.
                         deleted_resources.
                         filter(resource_title=self.
                                resGen1.metadata.title).count(), 1)
        self.assertEqual(self.resCollection.
                         deleted_resources.
                         filter(resource_title=self.
                                resModelInstance.metadata.title).count(), 1)

        # remove CollectionDeletedResource objs
        self.resCollection.deleted_resources.all().delete()
        self.assertEqual(CollectionDeletedResource.objects.count(), 0)
        self.assertEqual(self.resCollection.deleted_resources.count(), 0)

    def test_update_collection_set_add_remove_logic(self):
        # test update_type: set, add, remove

        self.assertEqual(self.resCollection.resources.count(), 0)
        url_to_update_collection = self.url_to_update_collection.format(self.resCollection.short_id)

        # user 1 login
        self.api_client.login(username='******', password='******')

        # test "update_type=set"
        # add 3 private member resources :[resGen1 resGen2 resGen3]
        response = self.api_client.post(url_to_update_collection,
                                        {'update_type': 'set',
                                         'resource_id_list':
                                         [self.resGen1.short_id, self.resGen2.short_id,
                                          self.resGen3.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(self.resCollection.resources.count(), 3)
        self.assertIn(self.resGen1, self.resCollection.resources.all())
        self.assertIn(self.resGen2, self.resCollection.resources.all())
        self.assertIn(self.resGen3, self.resCollection.resources.all())

        # set new list: [resGen1 resGen3 resGen4]
        response = self.api_client.post(url_to_update_collection,
                                        {'update_type': 'set',
                                         'resource_id_list':
                                         [self.resGen1.short_id, self.resGen3.short_id,
                                          self.resGen4.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(self.resCollection.resources.count(), 3)
        self.assertIn(self.resGen1, self.resCollection.resources.all())
        self.assertIn(self.resGen3, self.resCollection.resources.all())
        self.assertIn(self.resGen4, self.resCollection.resources.all())
        # resGen2 should be gone
        self.assertNotIn(self.resGen2, self.resCollection.resources.all())

        # set empty list []
        response = self.api_client.post(url_to_update_collection,
                                        {'update_type': 'set',
                                         'resource_id_list':
                                         []}, )
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(self.resCollection.resources.count(), 0)

        # test "update_type=add"
        # add to list: [resGen1 resGen2 resGen3]
        response = self.api_client.post(url_to_update_collection,
                                        {'update_type': 'add',
                                         'resource_id_list':
                                         [self.resGen1.short_id, self.resGen2.short_id,
                                          self.resGen3.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(self.resCollection.resources.count(), 3)
        self.assertIn(self.resGen1, self.resCollection.resources.all())
        self.assertIn(self.resGen2, self.resCollection.resources.all())
        self.assertIn(self.resGen3, self.resCollection.resources.all())

        # add to list [resGen4]
        response = self.api_client.post(url_to_update_collection,
                                        {'update_type': 'add',
                                         'resource_id_list':
                                         [self.resGen4.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(self.resCollection.resources.count(), 4)
        self.assertIn(self.resGen1, self.resCollection.resources.all())
        self.assertIn(self.resGen2, self.resCollection.resources.all())
        self.assertIn(self.resGen3, self.resCollection.resources.all())
        self.assertIn(self.resGen4, self.resCollection.resources.all())

        # add to list: empty []
        response = self.api_client.post(url_to_update_collection,
                                        {'update_type': 'add',
                                         'resource_id_list':
                                         []}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(self.resCollection.resources.count(), 4)
        self.assertIn(self.resGen1, self.resCollection.resources.all())
        self.assertIn(self.resGen2, self.resCollection.resources.all())
        self.assertIn(self.resGen3, self.resCollection.resources.all())
        self.assertIn(self.resGen4, self.resCollection.resources.all())

        # add a resource that is already in collection -- error expected
        response = self.api_client.post(url_to_update_collection,
                                        {'update_type': 'add',
                                         'resource_id_list':
                                         [self.resGen3.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "error")
        self.assertEqual(self.resCollection.resources.count(), 4)
        self.assertIn(self.resGen1, self.resCollection.resources.all())
        self.assertIn(self.resGen2, self.resCollection.resources.all())
        self.assertIn(self.resGen3, self.resCollection.resources.all())
        self.assertIn(self.resGen4, self.resCollection.resources.all())

        # test "update_type=remove"
        # remove from collection: [resGen1 resGen3]
        response = self.api_client.post(url_to_update_collection,
                                        {'update_type': 'remove',
                                         'resource_id_list':
                                         [self.resGen1.short_id,
                                          self.resGen3.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(self.resCollection.resources.count(), 2)
        self.assertIn(self.resGen2, self.resCollection.resources.all())
        self.assertIn(self.resGen4, self.resCollection.resources.all())

        # remove from collection: empty []
        response = self.api_client.post(url_to_update_collection,
                                        {'update_type': 'remove',
                                         'resource_id_list':
                                         []}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(self.resCollection.resources.count(), 2)
        self.assertIn(self.resGen2, self.resCollection.resources.all())
        self.assertIn(self.resGen4, self.resCollection.resources.all())

        # remove a resource that is not in collection: [resGen1] -- error expected
        response = self.api_client.post(url_to_update_collection,
                                        {'update_type': 'remove',
                                         'resource_id_list':
                                         [self.resGen1.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "error")
        self.assertEqual(self.resCollection.resources.count(), 2)
        self.assertIn(self.resGen2, self.resCollection.resources.all())
        self.assertIn(self.resGen4, self.resCollection.resources.all())

        # remove all remain resources: [resGen2, resGen4]
        response = self.api_client.post(url_to_update_collection,
                                        {'update_type': 'remove',
                                         'resource_id_list':
                                         [self.resGen2.short_id,
                                          self.resGen4.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(self.resCollection.resources.count(), 0)

    def test_update_collection_own_permission(self):
        # test update_collection()

        self.assertEqual(self.resCollection.resources.count(), 0)
        self.assertFalse(self.resCollection.can_be_public_or_discoverable)
        url_to_update_collection = self.url_to_update_collection.format(self.resCollection.short_id)

        # anonymous user
        # should inform frontend error
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list':
                                         [self.resGen1.short_id, self.resGen2.short_id,
                                          self.resGen3.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "error")
        self.assertEqual(resp_json["metadata_status"], "Insufficient to make public")
        self.assertFalse(self.resCollection.can_be_public_or_discoverable)

        # user 1 login
        self.api_client.login(username='******', password='******')

        # add 3 private member resources
        # should inform frontend "sufficient to make public"
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list':
                                         [self.resGen1.short_id, self.resGen2.short_id,
                                          self.resGen3.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(resp_json["metadata_status"], "Sufficient to make public")
        self.assertTrue(self.resCollection.can_be_public_or_discoverable)
        self.assertEqual(self.resCollection.resources.count(), 3)
        self.assertIn(self.resGen1, self.resCollection.resources.all())
        self.assertIn(self.resGen2, self.resCollection.resources.all())
        self.assertIn(self.resGen3, self.resCollection.resources.all())

        # remove renGen2 (just add 1 and 3)
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list':
                                         [self.resGen1.short_id, self.resGen3.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(resp_json["metadata_status"], "Sufficient to make public")
        self.assertTrue(self.resCollection.can_be_public_or_discoverable)
        self.assertEqual(self.resCollection.resources.count(), 2)
        self.assertIn(self.resGen1, self.resCollection.resources.all())
        self.assertNotIn(self.resGen2, self.resCollection.resources.all())
        self.assertIn(self.resGen3, self.resCollection.resources.all())

        # remove all existing contained resources
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list': []},
                                        )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(resp_json["metadata_status"], "Insufficient to make public")
        self.assertFalse(self.resCollection.can_be_public_or_discoverable)
        self.assertEqual(self.resCollection.resources.count(), 0)

        # add resGen1, resGen2, and resGen5 (no permission)
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list':
                                         [self.resGen1.short_id, self.resGen2.short_id,
                                          self.resGen5.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "error")
        self.assertEqual(self.resCollection.resources.count(), 0)

        # add resGen1 and resGen3
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list':
                                         [self.resGen1.short_id, self.resGen3.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(resp_json["metadata_status"], "Sufficient to make public")
        self.assertTrue(self.resCollection.can_be_public_or_discoverable)
        self.assertEqual(self.resCollection.resources.count(), 2)
        self.assertIn(self.resGen1, self.resCollection.resources.all())
        self.assertIn(self.resGen3, self.resCollection.resources.all())

        # remove resGen1 and resGen3, add resGen2 and resGen5 (no permission)
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list':
                                         [self.resGen2.short_id, self.resGen5.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "error")
        self.assertEqual(self.resCollection.resources.count(), 2)
        self.assertIn(self.resGen1, self.resCollection.resources.all())
        self.assertIn(self.resGen3, self.resCollection.resources.all())

        # grants View permission to User 1 over resGen5
        self.user2.uaccess.share_resource_with_user(self.resGen5, self.user1, PrivilegeCodes.VIEW)

        # remove resGen1 and resGen3, add resGen2 and resGen5 (having permission)
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list':
                                         [self.resGen2.short_id, self.resGen5.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertTrue(self.resCollection.can_be_public_or_discoverable)
        self.assertEqual(self.resCollection.resources.count(), 2)
        self.assertIn(self.resGen2, self.resCollection.resources.all())
        self.assertIn(self.resGen5, self.resCollection.resources.all())

        # test adding resources to a collection that does not have all the required metadata
        self.assertEqual(self.resCollection_with_missing_metadata.resources.count(), 0)
        url_to_update_collection = self.url_to_update_collection.format(
            self.resCollection_with_missing_metadata.short_id)

        self.assertFalse(self.resCollection_with_missing_metadata.can_be_public_or_discoverable)
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list':
                                         [self.resGen1.short_id, self.resGen2.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertFalse(self.resCollection_with_missing_metadata.can_be_public_or_discoverable)

    def test_update_collection_edit_permission(self):
        self.assertEqual(self.resCollection.resources.count(), 0)
        url_to_update_collection = self.url_to_update_collection.format(self.resCollection.short_id)

        # User 2 login
        self.api_client.login(username='******', password='******')

        # User 2: add resGen5 in to collection (User 2 has no permission over this collection)
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list': [self.resGen5.short_id]},
                                        )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "error")
        self.assertFalse(self.resCollection.can_be_public_or_discoverable)
        self.assertEqual(self.resCollection.resources.count(), 0)

        # grants View permission to User 2 over collection
        self.user1.uaccess.share_resource_with_user(self.resCollection,
                                                    self.user2, PrivilegeCodes.VIEW)

        # User 2: add resGen5 in to collection
        # (User 2 has View permission over this collection that is not enough)
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list': [self.resGen5.short_id]},
                                        )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "error")
        self.assertFalse(self.resCollection.can_be_public_or_discoverable)
        self.assertEqual(self.resCollection.resources.count(), 0)

        # grants Change permission to User 2 over collection
        self.user1.uaccess.share_resource_with_user(self.resCollection,
                                                    self.user2, PrivilegeCodes.CHANGE)

        # User 2: add resGen5 in to collection (User 2 has Change permission over this collection)
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list': [self.resGen5.short_id]},
                                        )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertTrue(self.resCollection.can_be_public_or_discoverable)
        self.assertEqual(self.resCollection.resources.count(), 1)
        self.assertIn(self.resGen5, self.resCollection.resources.all())

        # User 2: remove resGen5 and add resGen3 (no permission)
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list': [self.resGen3.short_id]},
                                        )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "error")
        self.assertTrue(self.resCollection.can_be_public_or_discoverable)
        self.assertEqual(self.resCollection.resources.count(), 1)
        self.assertIn(self.resGen5, self.resCollection.resources.all())

        # grants View permission to User 2 over renGen3
        self.user1.uaccess.share_resource_with_user(self.resGen3, self.user2, PrivilegeCodes.VIEW)

        # User 2: remove resGen5 and add resGen3 (View permission)
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list': [self.resGen3.short_id]},
                                        )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertTrue(self.resCollection.can_be_public_or_discoverable)
        self.assertEqual(self.resCollection.resources.count(), 1)
        self.assertIn(self.resGen3, self.resCollection.resources.all())

    def test_collection_holds_collection(self):
        # a collection resource can be added to another collection resource

        url_to_update_collection = self.url_to_update_collection.format(self.resCollection.short_id)

        # this collection should contain no resources at this point
        self.assertEqual(self.resCollection.resources.count(), 0)
        # user 1 login
        self.api_client.login(username='******', password='******')

        # add collection to itself
        # json response status should be error
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list': [self.resCollection.short_id]},
                                        )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "error")
        # collection still should have no resource
        self.assertEqual(self.resCollection.resources.count(), 0)

        # add one collection resource to another collection resource
        # json response status should be success
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list':
                                         [self.resCollection_with_missing_metadata.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        # collection should have 1 resource
        self.assertEqual(self.resCollection.resources.count(), 1)
        self.assertEqual(self.resCollection.resources.all()[0].resource_type.lower(),
                          "collectionresource")

    def test_update_collection_for_deleted_resources(self):
        self.assertEqual(self.resCollection.resources.count(), 0)
        self.assertEqual(self.resCollection.deleted_resources.count(), 0)
        self.assertFalse(self.resCollection.can_be_public_or_discoverable)

        # user 1 login
        self.api_client.login(username='******', password='******')

        # add 2 resources into collection
        url_to_update_collection = self.url_to_update_collection.format(self.resCollection.short_id)

        self.api_client.post(url_to_update_collection,
                             {'resource_id_list': [self.resGen1.short_id, self.resGen2.short_id,
                                                   ]})
        self.assertEqual(self.resCollection.resources.count(), 2)
        self.assertIn(self.resGen1, self.resCollection.resources.all())
        self.assertIn(self.resGen2, self.resCollection.resources.all())
        self.assertTrue(self.resCollection.can_be_public_or_discoverable)

        # at this point there should be no tracked deleted resource for the collection
        self.assertEqual(self.resCollection.deleted_resources.count(), 0)

        # delete resGen1
        res_id_resGen1 = self.resGen1.short_id
        url_to_delete_resource_for_resGen1 = \
            self.url_to_delete_resource.format(self.resGen1.short_id)
        self.api_client.post(url_to_delete_resource_for_resGen1, HTTP_REFERER='http://foo/bar')

        # delete resGen2
        res_id_resGen2 = self.resGen2.short_id
        url_to_delete_resource_for_resGen2 = \
            self.url_to_delete_resource.format(self.resGen2.short_id)
        self.api_client.post(url_to_delete_resource_for_resGen2, HTTP_REFERER='http://foo/bar')

        # resGen1 and resGen2 should not be in collection.resources
        self.assertEqual(self.resCollection.resources.count(), 0)
        self.assertNotIn(self.resGen1, self.resCollection.resources.all())
        self.assertNotIn(self.resGen2, self.resCollection.resources.all())
        self.assertFalse(self.resCollection.can_be_public_or_discoverable)

        # deleted_resources has info about resGen1 and resGen2
        self.assertEqual(CollectionDeletedResource.objects.count(), 2)
        # there should be now 2 tracked deleted resources for the collection
        self.assertEqual(self.resCollection.deleted_resources.count(), 2)
        self.assertIn(CollectionDeletedResource.objects.get(resource_id=res_id_resGen1),
                      self.resCollection.deleted_resources.all())
        self.assertIn(CollectionDeletedResource.objects.get(resource_id=res_id_resGen2),
                      self.resCollection.deleted_resources.all())

        # test clear deleted_resources through view
        url_to_update_collection_for_deleted_resources = \
            self.url_to_update_collection_for_deleted_resources.format(
             self.resCollection.short_id)

        # log out User 1
        self.api_client.logout()
        # log in as User 2
        self.api_client.login(username='******', password='******')

        # User 2 update_collection_for_deleted_resources --> error
        response = self.api_client.post(url_to_update_collection_for_deleted_resources)
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "error")
        self.assertEqual(self.resCollection.deleted_resources.count(), 2)

        # logout and login as User 1
        self.api_client.logout()
        self.api_client.login(username='******', password='******')

        # User 1update_collection_for_deleted_resources --> success
        response = self.api_client.post(url_to_update_collection_for_deleted_resources)
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        # there should be now no tracked deleted resources for the collection
        self.assertEqual(self.resCollection.deleted_resources.count(), 0)
        self.assertEqual(CollectionDeletedResource.objects.count(), 0)

    def test_are_all_contained_resources_published(self):
        # no contained resource
        self.assertEqual(self.resCollection.resources.count(), 0)
        # should return False
        self.assertEqual(self.resCollection.are_all_contained_resources_published, False)

        self.assertEqual(self.resGen1.raccess.published, False)
        self.assertEqual(self.resGeoFeature.raccess.published, False)

        # add 2 unpublished resources to collection
        self.resCollection.resources.add(self.resGen1)
        self.resCollection.resources.add(self.resGeoFeature)
        self.assertEqual(self.resCollection.resources.count(), 2)
        # not all contained res are published
        self.assertEqual(self.resCollection.are_all_contained_resources_published, False)

        # manually set the first contained res (self.resGen1) to published
        self.resGen1.raccess.published = True
        self.resGen1.raccess.save()
        self.assertEqual(self.resGen1.raccess.published, True)
        self.assertEqual(self.resGeoFeature.raccess.published, False)
        # not all contained res are published
        self.assertEqual(self.resCollection.are_all_contained_resources_published, False)

        # manually set the second contained res (self.resGeoFeature) to published as well
        self.resGeoFeature.raccess.published = True
        self.resGeoFeature.raccess.save()
        self.assertEqual(self.resGen1.raccess.published, True)
        self.assertEqual(self.resGeoFeature.raccess.published, True)
        # all contained res are published now
        self.assertEqual(self.resCollection.are_all_contained_resources_published, True)

    def test_versioning(self):
        # no contained resource
        self.assertEqual(self.resCollection.resources.count(), 0)

        # add 3 resources to collection
        self.resCollection.resources.add(self.resGen1)
        self.resCollection.resources.add(self.resGeoFeature)
        self.resCollection.resources.add(self.resCollection_with_missing_metadata)
        self.assertEqual(self.resCollection.resources.count(), 3)

        # make a new version of collection
        new_collection = create_empty_resource(self.resCollection.short_id, self.user1)

        new_collection = create_new_version_resource(self.resCollection, new_collection, self.user1)

        # test the new version is a collection
        self.assertTrue(isinstance(new_collection, CollectionResource))

        # new version collection should have same contained res as its original does
        self.assertEqual(new_collection.resources.count(), self.resCollection.resources.count())
        for contained_res in new_collection.resources.all():
            self.assertIn(contained_res, self.resCollection.resources.all())

        # changes to old version collection should not affect new version collection
        self.resCollection.resources.clear()
        self.assertEqual(self.resCollection.resources.count(), 0)
        self.assertEqual(new_collection.resources.count(), 3)

    def test_copy(self):
        # no contained resource
        self.assertEqual(self.resCollection.resources.count(), 0)

        # add 3 resources to collection
        self.resCollection.resources.add(self.resGen1)
        self.resCollection.resources.add(self.resGeoFeature)
        self.resCollection.resources.add(self.resCollection_with_missing_metadata)
        self.assertEqual(self.resCollection.resources.count(), 3)

        # make a new copy of collection
        new_collection = create_empty_resource(self.resCollection.short_id, self.user1,
                                               action='copy')

        new_collection = copy_resource(self.resCollection, new_collection)

        # test the new copy is a collection
        self.assertTrue(isinstance(new_collection, CollectionResource))

        # new copy collection should have same contained res as its original does
        self.assertEqual(new_collection.resources.count(), self.resCollection.resources.count())
        for contained_res in new_collection.resources.all():
            self.assertIn(contained_res, self.resCollection.resources.all())

        # changes to old collection should not affect new copied collection
        self.resCollection.resources.clear()
        self.assertEqual(self.resCollection.resources.count(), 0)
        self.assertEqual(new_collection.resources.count(), 3)

    def test_update_collection_coverages(self):
        # collection has no coverages metadata by default
        self.assertEqual(self.resCollection.metadata.coverages.count(), 0)
        # add 2 resources without coverage metadata to collection
        self.resCollection.resources.add(self.resGen1)
        self.resCollection.resources.add(self.resGeoFeature)
        self.assertEqual(self.resCollection.resources.count(), 2)
        # calculate overall coverages
        _update_collection_coverages(self.resCollection)
        # no collection coverage
        self.assertEqual(self.resCollection.metadata.coverages.count(), 0)
        # update resGen1 coverage
        metadata_dict = [{'coverage': {'type': 'period', 'value':
                         {'name': 'Name for period coverage',
                          'start': '1/1/2016', 'end': '12/31/2016'}}}, ]
        update_science_metadata(pk=self.resGen1.short_id, metadata=metadata_dict, user=self.user1)
        self.assertEqual(self.resGen1.metadata.coverages.count(), 1)
        # calculate overall coverages
        _update_collection_coverages(self.resCollection)
        # collection should have 1 coverage metadata: period
        self.assertEqual(self.resCollection.metadata.coverages.count(), 1)
        period_coverage_obj = self.resCollection.metadata.coverages.all()[0]
        self.assertEqual(period_coverage_obj.type.lower(), 'period')
        self.assertEqual(parser.parse(period_coverage_obj.value['start'].lower()),
                         parser.parse('1/1/2016'))
        self.assertEqual(parser.parse(period_coverage_obj.value['end'].lower()),
                         parser.parse('12/31/2016'))

        # update resGeoFeature coverage
        metadata_dict = [{'coverage': {'type': 'point', 'value':
                         {'name': 'Name for point coverage', 'east': '-20',
                          'north': '10', 'units': 'decimal deg'}}}, ]
        update_science_metadata(pk=self.resGeoFeature.short_id, metadata=metadata_dict,
                                user=self.user1)
        self.assertEqual(self.resGeoFeature.metadata.coverages.count(), 1)
        # calculate overall coverages
        _update_collection_coverages(self.resCollection)

        # collection should have 2 coverage metadata: period and point
        self.assertEqual(self.resCollection.metadata.coverages.count(), 2)
        # test period
        period_qs = self.resCollection.metadata.coverages.all().filter(type='period')
        self.assertEqual(period_qs.count(), 1)
        self.assertEqual(parser.parse(period_qs[0].value['start'].lower()),
                         parser.parse('1/1/2016'))
        self.assertEqual(parser.parse(period_qs[0].value['end'].lower()),
                         parser.parse('12/31/2016'))
        # test point
        point_qs = self.resCollection.metadata.coverages.all().filter(type='point')
        self.assertEqual(point_qs.count(), 1)
        self.assertEqual(point_qs[0].value['east'], -20)
        self.assertEqual(point_qs[0].value['north'], 10)

        # add a 3rd res with period and box coverages into collection
        metadata_dict = [{'coverage': {'type': 'period', 'value':
                         {'name': 'Name for period coverage',
                          'start': '1/1/2010', 'end': '6/1/2016'}}},
                         {'coverage': {'type': 'point', 'value':
                          {'name': 'Name for point coverage', 'east': '25',
                           'north': '-35', 'units': 'decimal deg'}}}]
        update_science_metadata(pk=self.resGen2.short_id, metadata=metadata_dict, user=self.user1)
        self.assertEqual(self.resGen2.metadata.coverages.count(), 2)
        self.resCollection.resources.add(self.resGen2)
        self.assertEqual(self.resCollection.resources.count(), 3)
        # calculate overall coverages
        _update_collection_coverages(self.resCollection)
        self.assertEqual(self.resCollection.metadata.coverages.count(), 2)
        # test period
        period_qs = self.resCollection.metadata.coverages.all().filter(type='period')
        self.assertEqual(period_qs.count(), 1)
        self.assertEqual(parser.parse(period_qs[0].value['start'].lower()),
                         parser.parse('1/1/2010'))
        self.assertEqual(parser.parse(period_qs[0].value['end'].lower()),
                         parser.parse('12/31/2016'))
        # test point
        point_qs = self.resCollection.metadata.coverages.all().filter(type='box')
        self.assertEqual(point_qs.count(), 1)
        self.assertEqual(point_qs[0].value['westlimit'], -20)
        self.assertEqual(point_qs[0].value['northlimit'], 10)
        self.assertEqual(point_qs[0].value['eastlimit'], 25)
        self.assertEqual(point_qs[0].value['southlimit'], -35)

        # test view func calculate_collection_coverages
        # user 1 login
        self.api_client.login(username='******', password='******')
        # add 2 resources into collection
        url_to_calculate_collection_coverages = \
            self.url_to_calculate_collection_coverages.\
            format(self.resCollection.short_id)
        response = self.api_client.post(url_to_calculate_collection_coverages)
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(len(resp_json["new_coverage_list"]), 2)
        found_period = False
        found_box = False
        for cv in resp_json["new_coverage_list"]:
            if cv["type"] == 'period':
                found_period = True
                self.assertEqual(parser.parse(cv['value']['start'].lower()),
                                 parser.parse('1/1/2010'))
                self.assertEqual(parser.parse(cv['value']['end'].lower()),
                                 parser.parse('12/31/2016'))
                self.assertEqual(cv['element_id_str'], '-1')
            elif cv["type"] == 'box':
                found_box = True
                self.assertEqual(cv['value']['westlimit'], -20)
                self.assertEqual(cv['value']['northlimit'], 10)
                self.assertEqual(cv['value']['eastlimit'], 25)
                self.assertEqual(cv['value']['southlimit'], -35)
                self.assertEqual(cv['element_id_str'], '-1')
        self.assertTrue(found_period)
        self.assertTrue(found_box)

        # remove all contained res
        self.resCollection.resources.clear()
        _update_collection_coverages(self.resCollection)
        self.assertEqual(self.resCollection.metadata.coverages.count(), 0)

    def test_hasPart_metadata(self):

        # no contained res
        self.assertEqual(self.resCollection.resources.count(), 0)
        # no hasPart metadata
        self.assertEqual(self.resCollection.metadata.relations.count(), 0)

        url_to_update_collection = self.url_to_update_collection.format(self.resCollection.short_id)
        # user 1 login
        self.api_client.login(username='******', password='******')
        # add 3 private member resources
        # should inform frontend "sufficient to make public"
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list':
                                         [self.resGen1.short_id, self.resGen2.short_id,
                                          self.resGen3.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(self.resCollection.resources.count(), 3)

        # should be 3 hasPart metadata
        self.assertEqual(self.resCollection.metadata.relations.count(), 3)

        # check contained res
        hasPart = "hasPart"

        # check self.resGen1.short_id
        value = RES_LANDING_PAGE_URL_TEMPLATE.format(self.resGen1.short_id)
        self.assertEqual(
            self.resCollection.metadata.relations.filter(type=hasPart, value=value).count(), 1)
        # check self.resGen2.short_id
        value = RES_LANDING_PAGE_URL_TEMPLATE.format(self.resGen2.short_id)
        self.assertEqual(
            self.resCollection.metadata.relations.filter(type=hasPart, value=value).count(), 1)
        # check self.resGen3.short_id
        value = RES_LANDING_PAGE_URL_TEMPLATE.format(self.resGen3.short_id)
        self.assertEqual(
            self.resCollection.metadata.relations.filter(type=hasPart, value=value).count(), 1)

        # remove renGen2 (keep 1 and 3)
        response = self.api_client.post(url_to_update_collection,
                                        {'resource_id_list':
                                         [self.resGen1.short_id, self.resGen3.short_id]}, )
        resp_json = json.loads(response.content.decode())
        self.assertEqual(resp_json["status"], "success")
        self.assertEqual(self.resCollection.resources.count(), 2)

        # should be 2 hasPart metadata
        self.assertEqual(self.resCollection.metadata.relations.count(), 2)

        # check self.resGen1.short_id
        value = RES_LANDING_PAGE_URL_TEMPLATE.format(self.resGen1.short_id)
        self.assertEqual(
            self.resCollection.metadata.relations.filter(type=hasPart, value=value).count(), 1)
        # check self.resGen2.short_id -- should be 0
        value = RES_LANDING_PAGE_URL_TEMPLATE.format(self.resGen2.short_id)
        self.assertEqual(
            self.resCollection.metadata.relations.filter(type=hasPart, value=value).count(), 0)
        # check self.resGen3.short_id
        value = RES_LANDING_PAGE_URL_TEMPLATE.format(self.resGen3.short_id)
        self.assertEqual(
            self.resCollection.metadata.relations.filter(type=hasPart, value=value).count(), 1)

    def test_save_resource_list_csv_to_bag(self):

        # test "update_text_file" attribute
        # by default it is 'True'
        self.assertEqual(self.resCollection.update_text_file, "True")
        # set it to 'False'
        self.resCollection.extra_data = {'update_text_file': 'False'}
        self.resCollection.save()
        self.assertEqual(self.resCollection.update_text_file, "False")
        # update_text_file is a read-only attribute
        with self.assertRaises(AttributeError):
            self.resCollection.update_text_file = "Invalid String"
        with self.assertRaises(AttributeError):
            self.resCollection.update_text_file = 1
        # set it back to 'True'
        self.resCollection.extra_data = {'update_text_file': 'True'}
        self.resCollection.save()
        self.assertEqual(self.resCollection.update_text_file, "True")

        # test update_collection_list_csv()
        self.assertEqual(self.resCollection.resources.count(), 0)
        self.resCollection.resources.add(self.resGen1)
        self.resCollection.resources.add(self.resGen2)
        self.resCollection.resources.add(self.resGen3)
        self.assertEqual(self.resCollection.resources.count(), 3)
        self.assertEqual(ResourceFile.objects.filter(object_id=self.resCollection.id).count(), 0)
        csv_list = update_collection_list_csv(self.resCollection)
        self.assertEqual(ResourceFile.objects.filter(object_id=self.resCollection.id).count(), 1)

        # csv_list should have 4 rows: header row + 3 data rows
        self.assertEqual(len(csv_list), 4)
        # add res_id to one list
        res_id_list = []
        res_id_list.append(csv_list[1][2])
        res_id_list.append(csv_list[2][2])
        res_id_list.append(csv_list[3][2])
        self.assertEqual(len(res_id_list), 3)
        self.assertIn(self.resGen1.short_id, res_id_list)
        self.assertIn(self.resGen2.short_id, res_id_list)
        self.assertIn(self.resGen3.short_id, res_id_list)
Example #53
0
class DispatcherTestCase(TestCase):
    """ Test the server-side function dispatcher.

    In these tests, we base64-encode every message we send to the server
    because this is what boto does.
    """
    def setUp(self):
        global CALL_COUNTER
        CALL_COUNTER = 0
        self.client = Client()
        self.url = reverse('beanstalk_dispatcher')

    @override_settings(**DISPATCH_SETTINGS)
    def test_no_get(self):
        response = self.client.get(self.url)
        self.assertEquals(response.status_code, 405)

    @override_settings(BEANSTALK_DISPATCH_TABLE=None)
    def test_no_dispatch(self):
        response = self.client.post(
            self.url,
            b64encode(create_request_body('some_func').encode('ascii')),
            content_type='application/json')
        self.assertEquals(response.status_code, 400)
        self.assertEquals(json.loads(response.content.decode()), {
            'message': 'No beanstalk dispatch table configured',
            'error': 400
        })

    @override_settings(**DISPATCH_SETTINGS)
    def test_missing_function(self):
        response = self.client.post(
            self.url,
            b64encode(create_request_body('nonexistent_func').encode('ascii')),
            content_type='application/json')
        self.assertEquals(response.status_code, 400)
        self.assertEquals(
            json.loads(response.content.decode()), {
                'message': 'Requested function not found: nonexistent_func',
                'error': 400
            })

    @override_settings(**DISPATCH_SETTINGS)
    def test_malformed_request(self):
        keys = {FUNCTION, ARGS, KWARGS}
        for missing_key in keys:
            request_body = {key: 'test' for key in keys - {missing_key}}
            response = self.client.post(
                self.url,
                b64encode(json.dumps(request_body).encode('ascii')),
                content_type='application/json')
            self.assertEquals(response.status_code, 400)
            self.assertEquals(
                json.loads(response.content.decode()), {
                    'message':
                    'Please provide a {} argument'.format(missing_key),
                    'error': 400
                })

    @override_settings(**DISPATCH_SETTINGS)
    def test_both_args_kwargs(self):
        body = b64encode(
            create_request_body('the_counter', 1,
                                second_arg=5).encode('ascii'))
        response = self.client.post(self.url,
                                    body,
                                    content_type='application/json')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(json.loads(response.content.decode()), {})
        self.assertEquals(CALL_COUNTER, 6)

    @override_settings(**DISPATCH_SETTINGS)
    def test_just_args(self):
        body = b64encode(create_request_body('the_counter', 2).encode('ascii'))
        response = self.client.post(self.url,
                                    body,
                                    content_type='application/json')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(json.loads(response.content.decode()), {})
        self.assertEquals(CALL_COUNTER, 2)
	def testOptimization(self):

		user = User.objects.filter(username='******')[0]
		self.assertEqual(len(Project.objects.filter(user=user)), 1)
		project = Project.objects.filter(user=user)[0]

		if isdir(join(settings.MEDIA_ROOT, project.folder)):
			rmtree(join(settings.MEDIA_ROOT, project.folder))
			mkdir(join(settings.MEDIA_ROOT, project.folder))

		self.assertEqual(len(SbmlModel.objects.filter(project=project)), 0)

		c = Client()
		self.assertTrue(c.login(username='******', password='******'))

		response_choose_project = c.get('/project/%s/' % project.folder)
		self.assertRedirects(response_choose_project, '/models/', status_code=302, target_status_code=200)

		self.assertEqual(len(SbmlModel.objects.filter(project=project)), 0)

		files_folder = join(dirname(__file__), "files")
		model_filename = join(files_folder, "modelx8Ow70.xml")

		response_load_model = c.post('/models/', {
			'action': 'load_model',
			'docfile': open(model_filename, 'rb')
		})

		self.assertEqual(response_load_model.status_code, 200)
		self.assertEqual(len(SbmlModel.objects.filter(project=project)), 1)

		response_create_experiment = c.post('/data/', {
			'action': 'save',
			'experiment_id': "",
			'experiment_name': "Enzymatic reaction",
			'experiment_notes': "Something"
		})

		self.assertEqual(response_create_experiment.status_code, 200)
		self.assertEqual(
			[experiment.name for experiment in response_create_experiment.context['experimental_data']],
			[u'Enzymatic reaction']
		)

		experiment_id = response_create_experiment.context['experimental_data'][0].id
		# Testing conditions

		response_choose_experiment = c.get('/data/%d/' % experiment_id)
		self.assertEqual(response_choose_experiment.status_code, 200)
		self.assertEqual(response_choose_experiment.context['experiment_name'], u'Enzymatic reaction')
		self.assertEqual(
			[condition.name for condition in response_choose_experiment.context['conditions']],
			[]
		)

		response_new_condition = c.post('/data/%d/' % experiment_id, {
			'action': 'save',
			'condition_id': "",
			'condition_name': "Test condition",
			'condition_notes': "Some notes"
		})

		self.assertEqual(response_new_condition.status_code, 200)
		self.assertEqual(
			[condition.name for condition in response_new_condition.context['conditions']],
			[u'Test condition']
		)

		condition_id = response_new_condition.context['conditions'][0].id

		response_choose_experiment = c.get('/data/%d/%d/' % (experiment_id, condition_id))
		self.assertEqual(response_choose_experiment.status_code, 200)
		self.assertEqual(len(response_choose_experiment.context['experiment_initial_data']), 0)

		response_add_treatment = c.post('/data/%d/%d/' % (experiment_id, condition_id), {
			'data_type': 'treatment',
			'action': 'save',
			'id': "",
			'name': 'Substrate',
			'time': 0,
			'value': 15
		})

		self.assertEqual(response_add_treatment.status_code, 200)
		self.assertEqual(len(response_add_treatment.context['experiment_initial_data']), 1)

		self.assertEqual(len(response_add_treatment.context['experiment_data']), 0)

		response_add_observation = c.post('/data/%d/%d/' % (experiment_id, condition_id), {
			'data_type': 'observation',
			'action': 'save',
			'id': "",
			'name': 'Product',
			'time': 0,
			'value': 0,
			'stddev': 0,
			'steady_state': 'off',
			'min_steady_state': "0",
			'max_steady_state': "0"
		})

		self.assertEqual(response_add_observation.status_code, 200)
		self.assertEqual(len(response_add_observation.context['experiment_data']), 1)

		response_add_observation = c.post('/data/%d/%d/' % (experiment_id, condition_id), {
			'data_type': 'observation',
			'action': 'save',
			'id': "",
			'name': 'Product',
			'time': 10,
			'value': 10,
			'stddev': 0,
			'steady_state': 'off',
			'min_steady_state': "0",
			'max_steady_state': "0"
		})

		self.assertEqual(response_add_observation.status_code, 200)
		self.assertEqual(len(response_add_observation.context['experiment_data']), 2)

		response_add_observation = c.post('/data/%d/%d/' % (experiment_id, condition_id), {
			'data_type': 'observation',
			'action': 'save',
			'id': "",
			'name': 'Product',
			'time': 20,
			'value': 15,
			'stddev': 0,
			'steady_state': 'off',
			'min_steady_state': "0",
			'max_steady_state': "0"
		})

		self.assertEqual(response_add_observation.status_code, 200)
		self.assertEqual(len(response_add_observation.context['experiment_data']), 3)

		response_add_observation = c.post('/data/%d/%d/' % (experiment_id, condition_id), {
			'data_type': 'observation',
			'action': 'save',
			'id': "",
			'name': 'Product',
			'time': 50,
			'value': 15,
			'stddev': 0,
			'steady_state': 'off',
			'min_steady_state': "0",
			'max_steady_state': "0"
		})

		self.assertEqual(response_add_observation.status_code, 200)
		self.assertEqual(len(response_add_observation.context['experiment_data']), 4)

		response_get_fit_data = c.get('/fit/data/')
		self.assertEqual(response_get_fit_data.status_code, 200)
		self.assertEqual(
			[dataset for dataset in response_get_fit_data.context['experimental_data_sets']],
			[u'Enzymatic reaction']
		)

		response_list_optimizations = c.get('/fit/list/')
		self.assertEqual(response_list_optimizations.status_code, 200)
		self.assertEqual(len(response_list_optimizations.context['optimizations']), 0)

		response_add_dataset = c.post('/json/add_dataset/', {
			'dataset_ind': 0
		})

		self.assertEqual(response_add_dataset.status_code, 200)
		mapping = loads(response_add_dataset.content.decode('utf-8'))['model_xpaths']

		sbml_filename = str(SbmlModel.objects.filter(project=project)[0].sbml_file)

		doc = SbmlDocument()
		doc.readSbmlFromFile(join(settings.MEDIA_ROOT, sbml_filename))

		self.assertEqual(sorted(list(mapping.keys())), ['Product', 'Substrate'])

		self.assertEqual(doc.model.listOfSpecies.index(doc.getByXPath(mapping['Substrate'])), 0)
		self.assertEqual(doc.model.listOfSpecies.index(doc.getByXPath(mapping['Product'])), 3)

		response_create_optimization = c.post('/fit/data/', {
			'action': 'create',
			'dataset_0': experiment_id,
			'list_dataset_0_data_species_0_value': "Product",
			'list_dataset_0_species_0_value': 3,
			'list_dataset_0_data_species_1_value': "Substrate",
			'list_dataset_0_species_1_value': 0,
			'parameter_0_active': "on",
			'parameter_0_id': 0,
			'parameter_0_name': "Binding rate",
			'parameter_0_value': 1.0,
			'parameter_0_min': 1e-4,
			'parameter_0_max': 1e+4,
			'parameter_0_precision': 7,
			'parameter_1_active': "on",
			'parameter_1_id': 0,
			'parameter_1_name': "Unbinding rate",
			'parameter_1_value': 1.0,
			'parameter_1_min': 1e-4,
			'parameter_1_max': 1e+4,
			'parameter_1_precision': 7,
			'parameter_2_active': "on",
			'parameter_2_id': 0,
			'parameter_2_name': "Catalytic rate",
			'parameter_2_value': 1.0,
			'parameter_2_min': 1e-4,
			'parameter_2_max': 1e+4,
			'parameter_2_precision': 7,

			'nb_cores': 2,
			'lambda': 0.001,
			'score_precision': 0.001,
			'param_precision': 7,
			'initial_temperature': 1,
			'initial_moves': 2000,
			'freeze_count': 100,
			'negative_penalty': 0
		})

		self.assertEqual(response_create_optimization.status_code, 200)
		self.assertEqual(response_create_optimization.context['form'].getErrors(), [])

		sleep(5)

		response_list_optimizations = c.get('/fit/list/')
		self.assertEqual(response_list_optimizations.status_code, 200)
		self.assertEqual(len(response_list_optimizations.context['optimizations']), 1)
		self.assertEqual(response_list_optimizations.context['optimizations'][0][0].status, "Running")

		sleep(10)

		response_get_optimization = c.get('/fit/%s/' % response_list_optimizations.context['optimizations'][0][0].optimization_id)
		self.assertEqual(response_get_optimization.status_code, 200)

		sleep(240)

		response_list_optimizations = c.get('/fit/list/')
		self.assertEqual(response_list_optimizations.status_code, 200)
		self.assertEqual(response_list_optimizations.context['optimizations'][0][0].status, "Finished")

		response_get_optimization = c.get(
			'/fit/%s/' % response_list_optimizations.context['optimizations'][0][0].optimization_id)
		self.assertEqual(response_get_optimization.status_code, 200)

		scores = response_get_optimization.context['score_values']
		self.assertTrue(scores[len(scores)-1] < 0.24)
Example #55
0
class Test_Api_Custom(TestCase):
    def setUp(self):
        # Every test needs a client.
        self.client = Client()
        # needed to setup django
        django.setup()

    def createContact(self, fuelSupplierId):
        testContactUrl = "/api/fuelsuppliercontacts"
        # Create:
        payload = fakedata.FuelSupplierContactTestDataCreate()
        payload['fuelSupplierFK'] = fuelSupplierId
        jsonString = json.dumps(payload)
        response = self.client.post(testContactUrl,
                                    content_type='application/json',
                                    data=jsonString)
        # Check that the response is OK.
        assert status.HTTP_201_CREATED == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        contactId = data['id']
        return contactId

    def createFuelSupplierStatus(self):
        testUrl = "/api/fuelsupplierstatuses"
        payload = fakedata.FuelSupplierStatusTestDataCreate()
        payload['effectiveDate'] = '2017-01-01'
        jsonString = json.dumps(payload)
        response = self.client.post(testUrl,
                                    content_type='application/json',
                                    data=jsonString)
        # Check that the response is OK.
        assert status.HTTP_201_CREATED == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        createdId = data['id']
        return createdId

    def createFuelSupplierActionType(self):
        testUrl = "/api/fuelsupplieractionstypes"
        payload = fakedata.FuelSupplierActionsTypeTestDataCreate()
        jsonString = json.dumps(payload)
        response = self.client.post(testUrl,
                                    content_type='application/json',
                                    data=jsonString)
        # Check that the response is OK.
        assert status.HTTP_201_CREATED == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        createdId = data['id']
        return createdId

    def createFuelSupplier(self):
        statusId = self.createFuelSupplierStatus()
        actionsTypeId = self.createFuelSupplierActionType()

        testUrl = "/api/fuelsuppliers"
        # Create:
        payload = {
            'name': "Initial",
            'status': "Initial",
            'createdDate': '2000-01-01',
            #   'primaryContact': contactId ,
            #   'contacts': [contactId],
            'notes': [],
            'attachments': [],
            'history': [],
            'fuelSupplierStatusFK': statusId,
            'fuelSupplierActionsTypeFK': actionsTypeId,
        }
        jsonString = json.dumps(payload)
        response = self.client.post(testUrl,
                                    content_type='application/json',
                                    data=jsonString)
        # Check that the response is OK.
        assert status.HTTP_201_CREATED == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        createdId = data['id']
        return createdId, statusId, actionsTypeId

    def createRole(self):
        testUrl = "/api/roles"
        # Create:
        fakeRole = fakedata.RoleTestDataCreate()
        payload = {
            'name': fakeRole['name'],
            'description': fakeRole['description']
        }
        jsonString = json.dumps(payload)
        response = self.client.post(testUrl,
                                    content_type='application/json',
                                    data=jsonString)
        # Check that the response is OK.
        assert status.HTTP_201_CREATED == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        createdId = data['id']
        return createdId

    def createPermission(self):
        testUrl = "/api/permissions"
        # Create:
        fakePermission = fakedata.PermissionTestDataCreate()
        payload = {
            'code': fakePermission['code'],
            'name': fakePermission['name'],
            'description': fakePermission['description']
        }
        jsonString = json.dumps(payload)
        response = self.client.post(testUrl,
                                    content_type='application/json',
                                    data=jsonString)
        # Check that the response is OK.
        assert status.HTTP_201_CREATED == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        createdId = data['id']
        return createdId

    def createUser(self, fuelsupplierId):
        testUserUrl = "/api/users"
        # Create:
        fakeUser = fakedata.UserTestDataCreate()
        payload = {
            'givenName': fakeUser['givenName'],
            'surname': fakeUser['surname'],
            'email': fakeUser['email'],
            'status': 'Active',
            'userFK': fakeUser['userId'],
            'guid': fakeUser['guid'],
            'authorizationDirectory': fakeUser['authorizationDirectory'],
            'fuelSupplier': fuelsupplierId
        }
        jsonString = json.dumps(payload)
        response = self.client.post(testUserUrl,
                                    content_type='application/json',
                                    data=jsonString)
        # Check that the response is OK.
        assert status.HTTP_201_CREATED == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        userId = data['id']
        return userId

    def createCreditTradeType(self):
        testUrl = "/api/credittradetypes"
        payload = fakedata.CreditTradeTypeTestDataCreate()
        payload['expirationDate'] = '2017-01-02'
        payload['effectiveDate'] = '2017-01-01'
        jsonString = json.dumps(payload)
        response = self.client.post(testUrl,
                                    content_type='application/json',
                                    data=jsonString)
        # Check that the response is OK.
        assert status.HTTP_201_CREATED == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        createdId = data['id']
        return createdId

    def createCreditTradeStatus(self):
        testUrl = "/api/credittradestatuses"
        payload = fakedata.CreditTradeStatusTestDataCreate()
        payload['effectiveDate'] = '2017-01-01'
        jsonString = json.dumps(payload)
        response = self.client.post(testUrl,
                                    content_type='application/json',
                                    data=jsonString)
        # Check that the response is OK.
        assert status.HTTP_201_CREATED == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        createdId = data['id']
        return createdId

    def createCreditTrade(self, fuelSupplierId, userId):
        typeId = self.createCreditTradeType()
        statusId = self.createCreditTradeStatus()

        testUrl = "/api/credittrades"
        payload = {
            'status': 'Active',
            'initiator': fuelSupplierId,
            'respondent': fuelSupplierId,
            'initiatorLastUpdateBy': userId,
            'respondentLastUpdatedBy': None,
            'reviewedRejectedBy': None,
            'approvedRejectedBy': None,
            'cancelledBy': None,
            'tradeExecutionDate': '2017-01-01',
            #   TODO: replace transactionType
            'transactionType': 'Type',
            'fairMarketValuePrice': '100.00',
            'fuelSupplierBalanceBeforeTransaction': '2017-01-01',
            'notes': [],
            'attachments': [],
            'history': [],
            'creditTradeTypeFK': typeId,
            'creditTradeStatusFK': statusId,
            'respondentFK': fuelSupplierId,
        }
        fakeCreditTrade = fakedata.CreditTradeTestDataCreate()
        payload.update(fakeCreditTrade)
        jsonString = json.dumps(payload)
        response = self.client.post(testUrl,
                                    content_type='application/json',
                                    data=jsonString)
        # Check that the response is OK.
        assert status.HTTP_201_CREATED == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        createdId = data['id']
        return createdId, typeId, statusId

    def createNotificationEvent(self):
        testUrl = "/api/notificationevents"
        payload = {
            'eventTime': '2017-01-01',
        }
        event = fakedata.NotificationEventTestDataCreate()
        payload.update(event)
        jsonString = json.dumps(payload)
        response = self.client.post(testUrl,
                                    content_type='application/json',
                                    data=jsonString)
        # Check that the response is OK.
        assert status.HTTP_201_CREATED == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        createdId = data['id']
        return createdId

    def createAndVerifyNotification(self):
        testUrl = "/api/notifications"

        fuelSupplierId, statusId, actionId = self.createFuelSupplier()
        userId = self.createUser(fuelSupplierId)
        notificationEventId = self.createNotificationEvent()

        payload = fakedata.NotificationTestDataCreate()
        payload['userFK'] = userId
        payload['notificationEventFK'] = notificationEventId

        request = json.dumps(payload)
        response = self.client.post(testUrl,
                                    content_type='application/json',
                                    data=request)

        assert status.HTTP_201_CREATED == response.status_code

        return json.loads(response.content.decode("utf-8"))

    def createUserFavourite(self, userId):
        url = "/api/users/" + str(userId) + "/favourites"

        payload = fakedata.UserFavouriteTestDataCreate()
        request = json.dumps(payload)
        response = self.client.post(url,
                                    content_type='application/json',
                                    data=request)

        assert status.HTTP_200_OK == response.status_code

        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        return data['id']

    def deleteContact(self, contactId):
        # cleanup the contact
        deleteUrl = "/api/fuelsuppliercontacts/" + str(contactId) + "/delete"
        response = self.client.post(deleteUrl)
        # Check that the response is OK.
        assert status.HTTP_204_NO_CONTENT == response.status_code

    def deleteRole(self, roleId):
        deleteUrl = "/api/roles/" + str(roleId) + "/delete"
        response = self.client.post(deleteUrl)
        # Check that the response is OK.
        assert status.HTTP_204_NO_CONTENT == response.status_code

    def deleteNotificationEvent(self, notificationEventId):
        deleteUrl = "/api/notificationevents/" + str(
            notificationEventId) + "/delete"
        response = self.client.post(deleteUrl)
        # Check that the response is OK.
        assert status.HTTP_204_NO_CONTENT == response.status_code

    def deleteUser(self, userId):
        deleteUrl = "/api/users/" + str(userId) + "/delete"
        response = self.client.post(deleteUrl)
        # Check that the response is OK
        assert status.HTTP_204_NO_CONTENT == response.status_code

    def deleteFuelSupplier(self, fuelsupplierId):
        deleteUrl = "/api/fuelsuppliers/" + str(fuelsupplierId) + "/delete"
        response = self.client.post(deleteUrl)
        # Check that the response is OK.
        assert status.HTTP_204_NO_CONTENT == response.status_code

    def deleteCreditTrade(self, creditTradeId):
        deleteUrl = "/api/credittrades/" + str(creditTradeId) + "/delete"
        response = self.client.post(deleteUrl)
        # Check that the response is OK.
        assert status.HTTP_204_NO_CONTENT == response.status_code

    def deletePermission(self, permissionId):
        deleteUrl = "/api/permissions/" + str(permissionId) + "/delete"
        response = self.client.post(deleteUrl)
        # Check that the response is OK.
        assert status.HTTP_204_NO_CONTENT == response.status_code

    def test_credittradesSearchGet(self):
        fsId, _, _ = self.createFuelSupplier()
        contactId = self.createContact(fsId)
        userId = self.createUser(fsId)
        credId, credTypeId, _ = self.createCreditTrade(fsId, userId)

        testUrl = "/api/credittrades/search"
        response = self.client.get(testUrl)
        assert status.HTTP_200_OK == response.status_code

        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        assert len(data) == 1

        self.deleteCreditTrade(credId)
        self.deleteUser(userId)
        self.deleteContact(contactId)
        self.deleteFuelSupplier(fsId)

    def test_usersCurrentFavouritesIdDeletePost(self):
        fsId, _, _ = self.createFuelSupplier()
        contactId = self.createContact(fsId)
        userId = self.createUser(fsId)
        userFavId = self.createUserFavourite(userId)

        url = "/api/users/current/favourites/" + str(userFavId) + "/delete"
        response = self.client.post(url)
        assert status.HTTP_200_OK == response.status_code

        self.deleteUser(userId)
        self.deleteContact(contactId)
        self.deleteFuelSupplier(fsId)

    def test_usersCurrentFavouritesPut(self):
        fsId, _, _ = self.createFuelSupplier()
        contactId = self.createContact(fsId)
        userId = self.createUser(fsId)

        url = "/api/users/current/favourites"
        payload = fakedata.UserFavouriteTestDataCreate()
        request = json.dumps(payload)
        response = self.client.post(url,
                                    content_type='application/json',
                                    data=request)

        assert status.HTTP_200_OK == response.status_code

        payload = [fakedata.UserFavouriteTestDataUpdate()]
        request = json.dumps(payload)
        response = self.client.put(url,
                                   content_type='application/json',
                                   data=request)

        assert status.HTTP_200_OK == response.status_code

        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)

        assert data[0]["value"] == "Changed"

        self.deleteUser(userId)
        self.deleteContact(contactId)
        self.deleteFuelSupplier(fsId)

    def test_usersCurrentFavouritesSearchGet(self):
        fsId, _, _ = self.createFuelSupplier()
        contactId = self.createContact(fsId)
        userId = self.createUser(fsId)
        userFavId = self.createUserFavourite(userId)

        url = "/api/users/current/favourites/search"
        response = self.client.get(url)
        assert status.HTTP_200_OK == response.status_code

        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        assert len(data) == 1

        self.deleteUser(userId)
        self.deleteContact(contactId)
        self.deleteFuelSupplier(fsId)

    def test_usersCurrentGet(self):
        fuelSupplierId, statusId, actionId = self.createFuelSupplier()
        contactId = self.createContact(fuelSupplierId)
        userId = self.createUser(fuelSupplierId)

        testUrl = "/api/users/current"
        # List:
        response = self.client.get(testUrl)
        assert status.HTTP_200_OK == response.status_code
        self.deleteUser(userId)
        self.deleteContact(contactId)
        self.deleteFuelSupplier(fuelSupplierId)

    def test_fuelsuppliersIdAttachmentsGet(self):
        fuelSupplierId, statusId, actionId = self.createFuelSupplier()
        contactId = self.createContact(fuelSupplierId)

        uploadUrl = "/api/fuelsuppliers/"
        uploadUrl += str(fuelSupplierId) + "/attachments"
        payload = fakedata.FuelSupplierAttachmentTestDataCreate()
        payload['fuelSupplierFK'] = fuelSupplierId
        rawData = "TEST"
        jsonString = json.dumps(payload)
        fileData = SimpleUploadedFile("file.txt", rawData.encode('utf-8'))
        form = {
            "file": fileData,
            "item": jsonString,
        }
        response = self.client.post(uploadUrl, data=form)
        # Check that the response is OK.
        assert status.HTTP_200_OK == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        createdId = data['id']

        testUrl = "/api/fuelsupplierattachments"
        # download the attachment.
        downloadUrl = testUrl + "/" + str(createdId)
        response = self.client.get(downloadUrl)
        # Check that the response is 200 OK.
        result = response.content.decode("utf-8")
        assert status.HTTP_200_OK == response.status_code
        parsed = response.content.decode("utf-8")

        # response should match the contents sent.
        # TODO: check that raw data matched returned parsed data
        # assert rawData==parsed

        # Cleanup:
        deleteUrl = "/api/fuelsupplierattachments/" + str(
            createdId) + "/delete"
        response = self.client.post(deleteUrl)
        # Check that the response is OK.
        assert status.HTTP_204_NO_CONTENT == response.status_code

        # Cleanup
        self.deleteContact(contactId)
        self.deleteFuelSupplier(fuelSupplierId)

    def test_fuelsuppliersIdHistoryGet(self):
        fuelSupplierId, statusId, actionId = self.createFuelSupplier()
        contactId = self.createContact(fuelSupplierId)

        testUrl = "/api/fuelsuppliers/" + str(fuelSupplierId) + "/history"
        payload = fakedata.FuelSupplierHistoryTestDataCreate()
        payload['fuelSupplierFK'] = fuelSupplierId
        jsonString = json.dumps(payload)
        response = self.client.post(testUrl,
                                    content_type='application/json',
                                    data=jsonString)
        # Check that the response is OK.
        assert status.HTTP_200_OK == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        createdId = data['id']

        # Cleanup the History
        deleteUrl = "/api/fuelsupplierhistories/" + str(createdId) + "/delete"
        response = self.client.post(deleteUrl)
        # Check that the response is OK.
        assert status.HTTP_204_NO_CONTENT == response.status_code

        # Cleanup
        self.deleteContact(contactId)
        self.deleteFuelSupplier(fuelSupplierId)

    def test_fuelsuppliersSearchGet(self):
        fuelSupplierId, statusId, actionId = self.createFuelSupplier()
        contactId = self.createContact(fuelSupplierId)

        # do a search
        testUrl = "/api/fuelsuppliers/search"
        response = self.client.get(testUrl)
        # Check that the response is OK.
        assert status.HTTP_200_OK == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        # Cleanup
        self.deleteContact(contactId)
        self.deleteFuelSupplier(fuelSupplierId)

    def test_rolesIdPermissionsGet(self):
        # create a group.
        roleId = self.createRole()
        # create a permission.
        permissionId = self.createPermission()

        rolePermissionUrl = "/api/roles/" + str(roleId) + "/permissions"
        # create a new group membership.
        payload = {'roleFK': roleId, 'permissionFK': permissionId}
        jsonString = json.dumps(payload)
        response = self.client.post(rolePermissionUrl,
                                    content_type='application/json',
                                    data=jsonString)
        assert status.HTTP_200_OK == response.status_code
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        rolePermissionId = data['id']

        # test the get
        response = self.client.get(rolePermissionUrl)
        assert status.HTTP_200_OK == response.status_code

        # test the put.  This will also delete the RolePermission.
        payload = []
        jsonString = json.dumps(payload)
        response = self.client.put(rolePermissionUrl,
                                   content_type='application/json',
                                   data=jsonString)
        assert status.HTTP_200_OK == response.status_code

        # cleanup

        self.deleteRole(roleId)
        self.deletePermission(permissionId)

    def test_rolesIdUsersGet(self):
        roleId = self.createRole()
        fuelSupplierId, statusId, actionId = self.createFuelSupplier()
        contactId = self.createContact(fuelSupplierId)
        userId = self.createUser(fuelSupplierId)

        userRoleUrl = "/api/users/" + str(userId) + "/roles"
        # create a new UserRole.
        payload = {
            'effectiveDate': '2000-01-01',
            'expiryDate': None,
            'user': userId,
            'role': roleId
        }
        jsonString = json.dumps(payload)
        response = self.client.post(userRoleUrl,
                                    content_type='application/json',
                                    data=jsonString)
        assert status.HTTP_200_OK == response.status_code

        # test the get
        response = self.client.get(userRoleUrl)
        assert status.HTTP_200_OK == response.status_code

        testUrl = "/api/roles/" + str(roleId)
        # get the users in the group.
        response = self.client.get(testUrl)
        # Check that the response is OK.
        assert status.HTTP_200_OK == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)

        # test the PUT - this will clear the user role map.
        payload = []
        jsonString = json.dumps(payload)
        response = self.client.put(userRoleUrl,
                                   content_type='application/json',
                                   data=jsonString)
        assert status.HTTP_200_OK == response.status_code

        # cleanup
        self.deleteRole(roleId)
        self.deleteUser(userId)
        self.deleteContact(contactId)
        self.deleteFuelSupplier(fuelSupplierId)

    def test_usersIdFavouritesGet(self):
        fsId, _, _ = self.createFuelSupplier()
        contactId = self.createContact(fsId)
        userId = self.createUser(fsId)

        url = "/api/users/" + str(userId) + "/favourites"
        payload = fakedata.UserFavouriteTestDataCreate()
        jsonString = json.dumps(payload)
        response = self.client.post(url,
                                    content_type='application/json',
                                    data=jsonString)

        assert status.HTTP_200_OK == response.status_code

        payload = [fakedata.UserFavouriteTestDataUpdate()]
        jsonString = json.dumps(payload)
        response = self.client.put(url,
                                   content_type='application/json',
                                   data=jsonString)

        assert status.HTTP_200_OK == response.status_code

        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)

        assert data[0]["value"] == "Changed"

        response = self.client.get(url)
        assert status.HTTP_200_OK == response.status_code

        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)

        assert len(data) > 0

        self.deleteUser(userId)
        self.deleteContact(contactId)
        self.deleteFuelSupplier(fsId)

    def test_usersIdNotificationsGet(self):
        fsId, fsTypeId, _ = self.createFuelSupplier()
        contactId = self.createContact(fsId)
        userId = self.createUser(fsId)
        credId, credTypeId, _ = self.createCreditTrade(fsId, userId)

        notificationEventId = self.createNotificationEvent()

        # add notification to user.
        userNotificationUrl = "/api/users/" + str(userId) + "/notifications"
        # create a new UserRole.
        payload = {
            'notificationEventFK': notificationEventId,
            'hasBeenViewed': False,
            'isWatchNotification': False,
            'userFK': userId
        }
        jsonString = json.dumps(payload)
        response = self.client.post(userNotificationUrl,
                                    content_type='application/json',
                                    data=jsonString)
        assert status.HTTP_200_OK == response.status_code

        # test the Get
        response = self.client.get(userNotificationUrl)
        assert status.HTTP_200_OK == response.status_code

        # cleanup
        self.deleteNotificationEvent(notificationEventId)
        self.deleteCreditTrade(credId)
        self.deleteUser(userId)
        self.deleteContact(contactId)
        self.deleteFuelSupplier(fsId)

    def test_usersIdPermissionsGet(self):
        # create a user.
        fuelSupplierId, statusId, actionId = self.createFuelSupplier()
        contactId = self.createContact(fuelSupplierId)
        userId = self.createUser(fuelSupplierId)

        # create a credit trade

        notificationEventId = self.createUser(fuelSupplierId)

        # assign permissions to the user.
        #TODO add that.

        userPermissionUrl = "/api/users/" + str(userId) + "/permissions"

        # test the Get
        response = self.client.get(userPermissionUrl)
        assert status.HTTP_200_OK == response.status_code

        # cleanup
        self.deleteUser(userId)
        self.deleteContact(contactId)
        self.deleteFuelSupplier(fuelSupplierId)

    def test_usersIdRolesGet(self):
        fsId, _, _ = self.createFuelSupplier()
        contactId = self.createContact(fsId)
        userId = self.createUser(fsId)
        roleId = self.createRole()

        url = "/api/users/" + str(userId) + "/roles"
        payload = fakedata.UserRoleTestDataCreate()
        payload['user'] = userId
        payload['role'] = roleId
        jsonString = json.dumps(payload)
        response = self.client.post(url,
                                    content_type='application/json',
                                    data=jsonString)

        assert response.status_code == status.HTTP_200_OK

        response = self.client.get(url)

        assert response.status_code == status.HTTP_200_OK

        payload = [fakedata.UserRoleTestDataUpdate()]
        payload[0]['user'] = userId
        payload[0]['role'] = roleId
        jsonString = json.dumps(payload)
        response = self.client.put(url,
                                   content_type='application/json',
                                   data=jsonString)

        assert response.status_code == status.HTTP_200_OK

        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)

        assert data[0]['userFK'] == userId
        assert data[0]['roleFK'] == roleId

        self.deleteRole(roleId)
        self.deleteUser(userId)
        self.deleteContact(contactId)
        self.deleteFuelSupplier(fsId)

    def test_usersSearchGet(self):
        fuelSupplierId, statusId, actionId = self.createFuelSupplier()
        contactId = self.createContact(fuelSupplierId)
        userId = self.createUser(fuelSupplierId)

        # do a search
        testUrl = "/api/users/search"
        response = self.client.get(testUrl)
        # Check that the response is OK.
        assert status.HTTP_200_OK == response.status_code
        # parse the response.
        jsonString = response.content.decode("utf-8")
        data = json.loads(jsonString)
        # Cleanup
        self.deleteUser(userId)
        self.deleteContact(contactId)
        self.deleteFuelSupplier(fuelSupplierId)

    def test_createCreditTradeNegativeNumberOfCredits(self):
        fsId, _, _ = self.createFuelSupplier()
        userId = self.createUser(fsId)
        typeId = self.createCreditTradeType()
        statusId = self.createCreditTradeStatus()

        testUrl = "/api/credittrades"
        payload = {
            'creditTradeStatusFK': statusId,
            'creditTradeTypeFK': typeId,
            'fairMarketValuePrice': '100.00',
            'historySet': [],
            'initiator': fsId,
            'respondentFK': fsId,
            'tradeEffectiveDate': '2017-01-01',
        }
        fakeCreditTrade = fakedata.CreditTradeTestDataCreate()
        payload.update(fakeCreditTrade)
        payload['numberOfCredits'] = -1
        jsonString = json.dumps(payload)
        response = self.client.post(testUrl,
                                    content_type='application/json',
                                    data=jsonString)
        # Check that the response is OK.
        assert status.HTTP_422_UNPROCESSABLE_ENTITY == response.status_code

        self.deleteUser(userId)
        self.deleteFuelSupplier(fsId)
Example #56
0
class BasicViewTests(TestCase):
    """Test view routing."""

    def setup(self):
        """Create client."""
        self.client = Client()

    # def test_home_route(self):
    #     """Route to home."""
    #     response = self.client.get('/')
    #     self.assertEqual(response.status_code, 200)

    # def test_home_route2(self):
    #     """Display home."""
    #     response = self.client.get('/')
    #     self.assertIn('Exquisite', response.content.decode('utf-8'))

    def test_login_route(self):
        """Route to login."""
        response = self.client.get('/accounts/login/')
        self.assertEqual(response.status_code, 200)

    def test_login_route2(self):
        """Display login."""
        response = self.client.get('/accounts/login/')
        self.assertIn('Username', response.content.decode('utf-8'))

    def test_register_route(self):
        """Route to register."""
        response = self.client.get('/accounts/register/')
        self.assertEqual(response.status_code, 200)

    def test_register_route2(self):
        """Display register."""
        response = self.client.get('/accounts/register/')
        self.assertIn('Email', response.content.decode('utf-8'))

    def test_logout_route(self):
        """Route to logout."""
        response = self.client.get('/accounts/logout/')
        self.assertEqual(response.status_code, 200)

    def test_logout_route2(self):
        """Display logout."""
        response = self.client.get('/accounts/logout/')
        self.assertIn('logged out', response.content.decode('utf-8'))

    def test_activate_route(self):
        """Route to activate."""
        response = self.client.get('/accounts/activate/complete/')
        self.assertEqual(response.status_code, 200)

    def test_activate_route2(self):
        """Display activate."""
        response = self.client.get('/accounts/activate/complete/')
        self.assertIn('Activation complete', response.content.decode('utf-8'))

    def test_registered_route(self):
        """Route to registered."""
        response = self.client.get('/accounts/register/complete/')
        self.assertEqual(response.status_code, 200)

    def test_registered_route2(self):
        """Display registered."""
        response = self.client.get('/accounts/register/complete/')
        self.assertIn(
            'Registration complete', response.content.decode('utf-8'))

    # def test_get_home_page(self):
    #     """Test get homepage."""
    #     response = self.client.get(reverse_lazy('home'))
    #     self.assertEqual(response.status_code, 200)
    #     self.assertEqual(response.templates[0].name, 'generic/home.html')
    #     self.assertEqual(response.templates[1].name, 'generic/base.html')

    def test_get_registration_page(self):
        """Test registration page."""
        response = self.client.get(reverse_lazy('registration_register'))
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.templates[0].name, 'registration/registration_form.html')
        self.assertEqual(response.templates[1].name, 'generic/base.html')

    def test_register_user(self):
        """Test for user registration."""
        response = self.client.post(
            reverse_lazy('registration_register'),
            {
                'username': '******',
                'password1': 'pass1234',
                'password2': 'pass1234',
                'email': '*****@*****.**'
            }, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.templates[0].name, 'registration/registration_complete.html')
        self.assertEqual(response.templates[1].name, 'generic/base.html')
        self.assertEqual(len(mail.outbox), 1)
        email = mail.outbox[0]
        self.assertEqual(email.to, ['*****@*****.**'])
        register_url = email.body.splitlines()[-1]
        register_url = urlparse(register_url)
        response = self.client.get(register_url.path)
        self.assertEqual(response.status_code, 302)
        self.assertTrue(self.client.login(username='******', password='******'))
Example #57
0
class ProductViewsTestCase(TestCase):
    """Views tests class."""
    def setUp(self):
        """Set up function."""
        self.client = Client()
        self.product_url = "/products/research_product"
        self.list_url = "/products/results_list"
        self.info_url = "/products/informations"
        self.substitute_url = "/products/save_substitute/"
        User.objects.create_user(username="******",
                                 email="*****@*****.**",
                                 password="******")
        Product.objects.create(name="oreo")
        Product.objects.create(name="oreo2")

    def test_research_product_found(self):
        """Test research_product."""
        self.client.login(email="*****@*****.**", password='******')
        product = "oreo"
        response = self.client.get(f"{self.product_url}/{product}/")
        self.assertTemplateUsed(response, "results.html")
        self.assertEqual(response.context["other_results"], 1)
        self.assertTrue(response.context.get("product"))

    def test_research_product_not_found(self):
        """Test research_product."""
        self.client.login(email="*****@*****.**", password='******')
        product = "potiron"
        response = self.client.get(f"{self.product_url}/{product}/")
        self.assertTemplateUsed(response, "no_products_found.html")

    def test_results_list_results(self):
        """Test results_list."""
        self.client.login(email="*****@*****.**", password='******')
        product = "oreo"
        response = self.client.get(f"{self.list_url}/{product}/")
        self.assertTrue(len(response.context["products"].object_list) == 2)

    def test_results_list_no_results(self):
        """Test results_list."""
        self.client.login(email="*****@*****.**", password='******')
        product = "xzxzxz"
        response = self.client.get(f"{self.list_url}/{product}/")
        self.assertTrue(len(response.context["products"].object_list) == 0)

    def test_informations_not_found(self):
        """Test informations."""
        self.client.login(email="*****@*****.**", password='******')
        product = "xzxzxz"
        response = self.client.get(f"{self.info_url}/{product}/")
        self.assertTemplateUsed(response, "product_not_found.html")

    def test_informations_found(self):
        """Test informations."""
        self.client.login(email="*****@*****.**", password='******')
        product = "oreo"
        response = self.client.get(f"{self.info_url}/{product}/")
        self.assertTemplateUsed(response, "informations.html")
        self.assertTrue(response.context.get("product"))
        self.assertTrue(response.context.get("nutriscore_img"))

    def test_save_substitute_no_double(self):
        """Test informations."""
        user = User.objects.get(email="*****@*****.**")
        self.client.login(email="*****@*****.**", password='******')
        base_product = Product.objects.get(name="oreo")
        product = Product.objects.get(name="oreo2")
        Substitute.objects.create(user=user,
                                  base_product=base_product,
                                  substituted=product)
        response = self.client.post(
            f"{self.substitute_url}", {
                "base_product": base_product,
                "product": product,
                "next": self.substitute_url
            })
        self.assertEqual(len(Substitute.objects.all()), 1)

    def test_save_substitute_OK(self):
        """Test informations."""
        user = User.objects.get(email="*****@*****.**")
        self.client.login(email="*****@*****.**", password='******')
        base_product = Product.objects.get(name="oreo")
        product = Product.objects.get(name="oreo2")
        response = self.client.post(
            f"{self.substitute_url}", {
                "base_product": base_product,
                "product": product,
                "next": self.substitute_url
            })
        self.assertEqual(len(Substitute.objects.all()), 1)
Example #58
0
class TestStringMethods(TestCase):
    # fixtures = ['testdata.json', 'auth.user']
    def setUp(self):
        """Создание пользователя, авторизация и добавление поста с проверкой на главной странице"""
        self.client = Client()
        response = self.client.post(reverse("signup"), USER_BY, follow=True)
        self.assertRedirects(response,
                             reverse("login"),
                             status_code=302,
                             target_status_code=200)
        print("Новый пользователь создан")
        response = self.client.post("/auth/login/", {
            'username': USER_BY['username'],
            'password': USER_BY['password']
        })
        print("Пользователь авторизован")
        self.client.post(reverse("new_post"), {'text': TEST_POST})
        cache.clear()
        response = self.client.get(reverse("index"))
        self.assertContains(response,
                            TEST_POST,
                            count=1,
                            status_code=200,
                            msg_prefix='Поста на INDEX странице нет')
        print("Создан пост на главной странице")

    def test_add_img(self):
        """Создание поста с картинкой"""
        with open("test_files/image.png", "rb") as fp:
            response = self.client.post(reverse("new_post"), {
                'text': TEST_POST_D,
                'image': fp
            })
        self.assertRedirects(response,
                             reverse("index"),
                             status_code=302,
                             target_status_code=200,
                             msg_prefix='',
                             fetch_redirect_response=True)
        print("Пользователь создал пост С КАРТИНКОЙ")

    def test_add_new_user(self):
        """Создание второго пользователя, авторизация, подписка на первого и добавление коментария"""
        response = self.client.post(reverse("signup"), USER_DY, follow=True)
        self.assertRedirects(response,
                             "/auth/login/",
                             status_code=302,
                             target_status_code=200)
        print("Второй пользователь создан")
        self.client.post("/auth/login/", {
            'username': '******',
            'password': '******'
        })
        print("Второй пользователь авторизован")

        response = self.client.post(reverse(
            "profile_follow", kwargs={'username': USER_BY['username']}),
                                    follow=True)
        print("Подписка на АВТОРА")
        self.assertRedirects(response,
                             reverse("follow_index"),
                             status_code=302,
                             target_status_code=200)

        response = self.client.get(reverse("follow_index"))
        self.assertContains(response,
                            TEST_POST,
                            count=1,
                            status_code=200,
                            msg_prefix='Поста на follow_index странице нет')
        print("Пост на follow_index странице USERA")

        self.client.post(
            reverse("add_comment",
                    kwargs={
                        'username': USER_BY['username'],
                        'post_id': 1
                    }), {'text': COMMENT})
        response = self.client.get("/testuser/1/", follow=True)
        self.assertContains(response,
                            COMMENT,
                            count=1,
                            status_code=200,
                            msg_prefix='Комментария на post странице нет')
        print("Коментарий на странице POST USERA")

    def test_no_picture_ban(self):
        """Добавление не картинки, к посту"""
        with open("test_files/test_file.txt", "rb") as fp:
            response = self.client.post(reverse("new_post"), {
                'text': TEST_POST,
                'image': fp
            })
        response = self.client.get(reverse("index"))
        self.assertContains(
            response,
            '<img',
            count=0,
            status_code=200,
            msg_prefix='Файл не картинка, ИСКЛЮЧЕНИЯ НЕ ВЫЗВАЛ')
        print("Файл не картинка, НЕ ДОБАВИЛСЯ")

    def test_not_found(self):
        """Отсутствие страницы, код 404"""
        response = self.client.get("/not_fount/")
        self.assertEqual(response.status_code, 404)

    def test_send_mail(self):
        """Отправка письма пользователю"""
        self.assertEqual(len(mail.outbox), 1)
        self.assertEqual(mail.outbox[0].subject, 'Тема письма')
        print("Письмо отправлено")

    def test_view_new_post_page(self):
        """Доступ к странице добавления поста, для зарегистрированого пользователя"""
        response = self.client.get(reverse("new_post"))
        self.assertEqual(response.status_code, 200)
        print("Доступ к странице добавления поста, есть!")

    def test_view_index_page(self):
        """Проверка наличие поста на главной странице"""
        response = self.client.get(reverse("index"))
        self.assertContains(response,
                            TEST_POST,
                            count=1,
                            status_code=200,
                            msg_prefix='Поста на главной странице нет')
        print("Пост на главной странице")

    def test_view_profile_page(self):
        """Наличие поста на странице профиля пользователя"""
        response = self.client.get(
            reverse("profile", kwargs={'username': USER_BY['username']}))
        self.assertContains(response,
                            TEST_POST,
                            count=1,
                            status_code=200,
                            msg_prefix='Поста profile на странице нет')
        print("Пост на profile странице")

    def test_view_edit_page(self):
        """Редактирование поста"""
        self.client.post(
            reverse("post_edit",
                    kwargs={
                        'username': USER_BY['username'],
                        'post_id': 1
                    }), {'text': 'My best Editen text!'})
        print("Страница поста редактирования")
        response = self.client.get(
            reverse("post",
                    kwargs={
                        'username': USER_BY['username'],
                        'post_id': 1
                    }))
        self.assertContains(response,
                            'My best Editen text!',
                            count=1,
                            status_code=200,
                            msg_prefix='Поста на главной странице нет',
                            html=False)
        print("Отредактированый пост на главной странице")

    def test_not_add_comment(self):
        """Не авторизованый пользователь не может добавить коментарий"""
        self.client.get(reverse("logout"))
        self.client.post(
            reverse("add_comment",
                    kwargs={
                        'username': USER_BY['username'],
                        'post_id': 1
                    }), {'text': COMMENT})
        response = self.client.get(
            reverse("post",
                    kwargs={
                        'username': USER_BY['username'],
                        'post_id': 1
                    }))
        self.assertContains(response,
                            COMMENT,
                            count=0,
                            status_code=200,
                            msg_prefix='Комментарий на post странице')
        print("Коментарий нет POST USERA")

    def test_cache_view(self):
        """Проверка срабатывания кеширования"""
        self.client.post(
            reverse("post_edit",
                    kwargs={
                        'username': USER_BY['username'],
                        'post_id': 1
                    }), {'text': 'My best Editen text!'})
        response = self.client.get(reverse("index"))
        self.assertContains(response, 'My best Editen text!', count=0)
        print(
            "Отредактированый пост на главной странице не отображается, кешируется старый"
        )
        cache.clear()
        response = self.client.get(reverse("index"))
        self.assertContains(response, 'My best Editen text!', count=1)
        print("Отредактированый пост на post странице минуя кеш")

    def test_cache_index_page(self):
        """Проверка срабатывания кеширования второй вариант"""
        cache.set('index_page', COMMENT)
        cache.set('index_page_2', 'Two comment')
        response = cache.get('index_page_2')
        self.assertNotEqual(response, COMMENT)
        # cache.clear()
        response = cache.get('index_page')
        self.assertEqual(response, COMMENT)
Example #59
0
class CommentsViewTest(TestCase):
    def setUp(self):
        self.client = Client()
        self.user = User.objects.create_user(email='*****@*****.**',
                                             password='******',
                                             name='test')
        self.user1 = User.objects.create_user(name='test1',
                                              email='*****@*****.**',
                                              password='******')
        self.post = Post.objects.create(user=self.user, body='test_post')
        self.comment = Comment.objects.create(post=self.post,
                                              user=self.user,
                                              body='test_comment')
        self.client.force_login(self.user)

    def test_reply_form_with_parent(self):
        data = {
            'body': 'test comment with parent',
            'parent_id': self.comment.pk
        }
        response = self.client.post(reverse('reply_form',
                                            kwargs={
                                                'pk': self.post.pk,
                                                'parent_id': self.comment.pk
                                            }),
                                    data=data,
                                    follow=True)
        self.assertTrue(
            isinstance(
                Comment.objects.filter(
                    body='test comment with parent').first(), Comment))
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'post_detail.html')

    def test_reply_form_with_no_parent(self):
        data = {'body': 'test comment with parent'}
        self.client.post(reverse('reply_form',
                                 kwargs={
                                     'pk': self.post.pk,
                                     'parent_id': self.comment.pk
                                 }),
                         data=data,
                         follow=True)
        self.assertTrue(
            isinstance(
                Comment.objects.filter(
                    body='test comment with parent').first(), Comment))

    def test_reply_form_with_parent_fail_no_post(self):
        data = {
            'body': 'test comment with parent',
            'parent_id': self.comment.pk
        }
        response = self.client.post(reverse('reply_form',
                                            kwargs={
                                                'pk': '10',
                                                'parent_id': self.comment.pk
                                            }),
                                    data=data,
                                    follow=True)
        self.assertIn(force_bytes('Action not allowed'), response.content)

    def test_reply_form_not_user(self):
        self.client.logout()
        response = self.client.get(reverse('post_detail',
                                           kwargs={'pk': self.post.pk}),
                                   follow=True)
        self.assertRedirects(response, '/login/')

    def test_delete_comment(self):
        self.client.get(reverse('delete_comment',
                                kwargs={'pk': self.comment.pk}),
                        follow=True)
        self.assertEqual(len(Comment.objects.filter(body='test_comment')), 0)

    def test_delete_comment_not_commenter(self):
        comment = Comment.objects.create(user=self.user1, body='test_comment1')
        response = self.client.get(reverse('delete_comment',
                                           kwargs={'pk': comment.pk}),
                                   follow=True)
        self.assertIn(force_bytes('You can only delete your own comments'),
                      response.content)

    def test_delete_comment_fail(self):
        response = self.client.get(reverse('delete_comment',
                                           kwargs={'pk': '10'}),
                                   follow=True)
        self.assertIn(force_bytes('Action not allowed'), response.content)

    def test_edit_comment(self):
        data = {'body': 'test comment changed'}
        self.client.post(reverse('edit_comment',
                                 kwargs={'pk': self.comment.pk}),
                         data=data,
                         follow=True)
        g_response = self.client.get(reverse('edit_comment',
                                             kwargs={'pk': self.comment.pk}),
                                     follow=True)
        self.assertIsNotNone(
            Comment.objects.filter(body='test comment changed'))
        self.assertTemplateUsed(g_response, 'edit_comment.html')

    def test_edit_comment_fail(self):
        data = {'body': 'test comment changed'}
        response = self.client.post(reverse('edit_comment',
                                            kwargs={'pk': '10'}),
                                    data=data,
                                    follow=True)
        self.assertIn(force_bytes('Action not allowed'), response.content)

    def test_like_comment(self):
        self.client.get(reverse('like_comment', kwargs={'pk':
                                                        self.comment.pk}))
        self.assertIn(self.user, self.comment.likers.all())

        self.client.get(reverse('like_comment', kwargs={'pk':
                                                        self.comment.pk}))
        self.assertNotIn(self.user, self.comment.likers.all())
        self.assertNotIn(self.user, self.comment.dislikers.all())

        self.client.get(reverse('like_comment', kwargs={'pk':
                                                        self.comment.pk}))
        self.assertIn(self.user, self.comment.likers.all())
        self.assertNotIn(self.user, self.comment.dislikers.all())

        self.comment.dislikers.add(self.user)
        self.comment.likers.remove(self.user)
        self.client.get(reverse('like_comment', kwargs={'pk':
                                                        self.comment.pk}))
        self.assertIn(self.user, self.comment.likers.all())
        self.assertNotIn(self.user, self.comment.dislikers.all())

    def test_like_comment_fail(self):
        response = self.client.get(reverse('like_comment', kwargs={'pk':
                                                                   '10'}))
        self.assertIn(force_bytes('Action not allowed'), response.content)

    def test_dislike_comment(self):
        self.client.get(
            reverse('dislike_comment', kwargs={'pk': self.comment.pk}))
        self.assertIn(self.user, self.comment.dislikers.all())

        self.client.get(
            reverse('dislike_comment', kwargs={'pk': self.comment.pk}))
        self.assertNotIn(self.user, self.comment.dislikers.all())
        self.assertNotIn(self.user, self.comment.likers.all())

        self.client.get(
            reverse('dislike_comment', kwargs={'pk': self.comment.pk}))
        self.assertIn(self.user, self.comment.dislikers.all())
        self.assertNotIn(self.user, self.comment.likers.all())

        self.comment.likers.add(self.user)
        self.comment.dislikers.remove(self.user)
        self.client.get(
            reverse('dislike_comment', kwargs={'pk': self.comment.pk}))
        self.assertIn(self.user, self.comment.dislikers.all())
        self.assertNotIn(self.user, self.comment.likers.all())

    def test_dislike_comment_fail(self):
        response = self.client.get(
            reverse('dislike_comment', kwargs={'pk': '10'}))
        self.assertIn(force_bytes('Action not allowed'), response.content)
Example #60
0
class LabViewsTestCase(TestCase):
    def setUp(self):
        self.client = Client()

        self.lab = G(Lab, name="ECCL", institution="MIT", approved_to_test=False)
        self.lab2 = G(Lab, name="Second lab")
        self.researcher = G(
            User, is_active=True, is_researcher=True, given_name="Alice"
        )
        self.researcher_outside_lab = G(
            User, is_active=True, is_researcher=True, given_name="Bobbington"
        )
        self.researcher_in_lab = G(
            User, is_active=True, is_researcher=True, given_name="Candice"
        )
        self.lab.researchers.add(self.researcher)
        self.lab.researchers.add(self.researcher_in_lab)
        self.lab.member_group.user_set.add(self.researcher_in_lab)
        self.lab.save()

        self.study_type = G(StudyType, name="default", id=1)
        self.study = G(
            Study, creator=self.researcher, study_type=self.study_type, lab=self.lab
        )
        self.study.researcher_group.user_set.add(self.researcher_in_lab)

        self.superuser = G(User, is_active=True, is_researcher=True, is_superuser=True)
        self.participant = G(User, is_active=True)

        self.create_lab_url = reverse("exp:lab-create")
        self.lab_detail_url = reverse("exp:lab-detail", kwargs={"pk": self.lab.pk})
        self.lab_members_url = reverse("exp:lab-members", kwargs={"pk": self.lab.pk})
        self.lab_list_url = reverse("exp:lab-list")
        self.lab2_request_url = reverse("exp:lab-request", kwargs={"pk": self.lab2.pk})
        self.lab_update_url = reverse("exp:lab-edit", kwargs={"pk": self.lab.pk})

    # Create lab view: can get as researcher
    def testCanGetCreateLabViewAsResearcher(self):
        self.client.force_login(self.researcher)
        page = self.client.get(self.create_lab_url)
        self.assertEqual(
            page.status_code, 200, "Unable to get create lab view as researcher"
        )
        self.assertTemplateUsed(
            page,
            "studies/lab_create.html",
            "Incorrect template used for displaying create lab form",
        )

    # Create lab view: can create new lab as researcher
    def testCanCreateNewLabAsResearcher(self):
        self.client.force_login(self.researcher)
        post_data = {
            "name": "New lab",
            "principal_investigator_name": "Jane Smith",
            "institution": "MIT",
            "contact_email": "*****@*****.**",
            "contact_phone": "(123) 456-7890",
            "lab_website": "https://mit.edu",
            "description": "ABCDEFG",
            "irb_contact_info": "how to reach the IRB",
        }
        page = self.client.post(self.create_lab_url, post_data)
        self.assertEqual(page.status_code, 302, "Unable to create lab as researcher")

    # Create lab view: cannot get as participant
    def testCanGetCreateLabViewAsParticipant(self):
        self.client.force_login(self.participant)
        page = self.client.get(self.create_lab_url)
        self.assertEqual(
            page.status_code, 403, "Participant is able to create a new lab!"
        )

    # Lab detail view: can see as researcher
    def testCanGetLabDetailViewAsResearcher(self):
        self.client.force_login(self.researcher)
        page = self.client.get(self.lab_detail_url)
        self.assertEqual(
            page.status_code, 200, "Unable to get lab detail view as researcher"
        )
        self.assertTemplateUsed(
            page,
            "studies/lab_detail.html",
            "Incorrect template used for displaying lab detail page",
        )

    # Lab detail view: cannot see as participant
    def testCanGetLabDetailViewAsParticipant(self):
        self.client.force_login(self.participant)
        page = self.client.get(self.lab_detail_url)
        self.assertEqual(
            page.status_code, 403, "Participant is able to view exp lab detail page!"
        )

    # Lab members view: cannot see as researcher not in lab
    def testCannotGetLabMembersViewAsUnaffiliatedResearcher(self):
        self.client.force_login(self.researcher_outside_lab)
        page = self.client.get(self.lab_members_url)
        self.assertEqual(
            page.status_code, 403, "Unaffiliated researcher is able to view lab members"
        )

    # Lab members view: can see as researcher in lab.
    def testCanGetLabMembersViewAsLabResearcher(self):
        self.client.force_login(self.researcher)
        page = self.client.get(self.lab_members_url)
        self.assertEqual(
            page.status_code, 200, "Unable to get lab members view as lab researcher"
        )
        self.assertTemplateUsed(
            page,
            "studies/lab_member_list.html",
            "Incorrect template used for displaying lab member page",
        )
        # note - can use page.context_data too!
        self.assertIn("Alice", page.rendered_content)
        self.assertIn("Candice", page.rendered_content)
        self.assertNotIn("Bobbington", page.rendered_content)

    # Lab members view: cannot post as researcher in lab w/o manage perms
    def testPostLabMembersViewIncorrectPerms(self):
        self.client.force_login(self.researcher)
        post_data = {
            "user_action": "make_member",
            "user_id": self.researcher_outside_lab.pk,
        }
        page = self.client.post(self.lab_members_url, post_data)
        self.assertEqual(
            page.status_code,
            403,
            "Researcher able to add new lab member without permissions",
        )

    # Lab members view: can add new researcher w/ appropriate perms
    def testAddNewLabMemberWithCorrectPerms(self):
        self.client.force_login(self.researcher)
        assign_perm(
            LabPermission.MANAGE_LAB_RESEARCHERS.codename, self.researcher, self.lab
        )
        post_data = {
            "user_action": "make_guest",
            "user_id": self.researcher_outside_lab.pk,
        }
        page = self.client.post(self.lab_members_url, post_data)
        self.assertEqual(
            page.status_code,
            302,
            "Researcher unable to add new lab member despite correct permissions",
        )
        self.assertRedirects(page, self.lab_members_url)
        self.assertIn(
            self.lab,
            self.researcher_outside_lab.labs.all(),
            "Researcher not successfully added to lab",
        )
        self.assertIn(self.researcher_outside_lab, self.lab.guest_group.user_set.all())

    # Lab members view: can remove researcher w/ appropriate perms
    def testRemoveLabMemberWithCorrectPerms(self):
        self.client.force_login(self.researcher)
        assign_perm(
            LabPermission.MANAGE_LAB_RESEARCHERS.codename, self.researcher, self.lab
        )
        post_data = {
            "user_action": "remove_researcher",
            "user_id": self.researcher_in_lab.pk,
        }
        page = self.client.post(self.lab_members_url, post_data)
        self.assertEqual(
            page.status_code,
            302,
            "Researcher unable to remove lab member despite correct permissions",
        )
        self.assertRedirects(page, self.lab_members_url)
        self.assertNotIn(self.lab, self.researcher_in_lab.labs.all())
        self.assertNotIn(
            self.researcher_in_lab,
            self.lab.member_group.user_set.all(),
            "Researcher removed from lab but not from associated member group",
        )
        self.assertNotIn(
            self.researcher_in_lab,
            self.study.researcher_group.user_set.all(),
            "Researcher removed from lab but not from associated study group",
        )

    # Lab list view: can see as researcher
    def testCanGetLabListViewAsResearcher(self):
        self.client.force_login(self.researcher)
        page = self.client.get(self.lab_list_url)
        self.assertEqual(
            page.status_code, 200, "Unable to get lab list view as researcher"
        )
        self.assertTemplateUsed(
            page,
            "studies/lab_list.html",
            "Incorrect template used for displaying lab list page",
        )

    # Lab list view: cannot see as participant
    def testCanGetLabListViewAsParticipant(self):
        self.client.force_login(self.participant)
        page = self.client.get(self.lab_list_url)
        self.assertEqual(
            page.status_code, 403, "Participant is able to view exp lab list page!"
        )

    # Lab update view: cannot get as researcher w/o edit perms
    def testGetLabUpdateViewIncorrectPerms(self):
        assign_perm(
            LabPermission.MANAGE_LAB_RESEARCHERS.codename, self.researcher, self.lab
        )
        self.client.force_login(self.researcher)
        page = self.client.get(self.lab_update_url)
        self.assertEqual(
            page.status_code,
            403,
            "Researcher able to access lab update view without permissions",
        )

    # Lab update view: can get as researcher w/ edit perms
    def testGetLabUpdateViewCorrectPerms(self):
        assign_perm(LabPermission.EDIT_LAB_METADATA.codename, self.researcher, self.lab)
        self.client.force_login(self.researcher)
        page = self.client.get(self.lab_update_url)
        self.assertEqual(
            page.status_code,
            200,
            "Researcher not able to access lab update view despite permissions",
        )

    # Lab update view: cannot post as researcher w/o edit perms
    def testPostLabUpdateViewIncorrectPerms(self):
        assign_perm(
            LabPermission.MANAGE_LAB_RESEARCHERS.codename, self.researcher, self.lab
        )
        self.client.force_login(self.researcher)
        post_data = {
            "name": "New lab",
            "principal_investigator_name": "Jane Smith",
            "institution": "New institution",
            "contact_email": "*****@*****.**",
            "contact_phone": "(123) 456-7890",
            "lab_website": "https://mit.edu",
            "description": "ABCDEFG",
            "irb_contact_info": "how to reach the IRB",
        }
        page = self.client.post(self.lab_update_url, post_data)
        self.assertEqual(
            page.status_code,
            403,
            "Researcher able to edit lab metadata without permissions",
        )
        updated_lab = Lab.objects.get(pk=self.lab.pk)
        self.assertEqual(updated_lab.institution, "MIT")

    # Lab update view: can post as researcher w/ edit perms
    def testPostLabUpdateViewCorrectPerms(self):
        assign_perm(LabPermission.EDIT_LAB_METADATA.codename, self.researcher, self.lab)
        self.client.force_login(self.researcher)
        post_data = {
            "name": "New lab",
            "principal_investigator_name": "Jane Smith",
            "institution": "New institution",
            "contact_email": "*****@*****.**",
            "contact_phone": "(123) 456-7890",
            "lab_website": "https://mit.edu",
            "description": "ABCDEFG",
            "irb_contact_info": "how to reach the IRB",
        }
        page = self.client.post(self.lab_update_url, post_data)
        self.assertEqual(
            page.status_code,
            302,
            "Researcher unable to edit lab metadata despite permissions",
        )
        updated_lab = Lab.objects.get(pk=self.lab.pk)
        self.assertEqual(updated_lab.institution, "New institution")

    # Lab update view: cannot update approved_to_test
    def testPostLabUpdateViewEditApproval(self):
        assign_perm(LabPermission.EDIT_LAB_METADATA.codename, self.researcher, self.lab)
        self.client.force_login(self.researcher)
        post_data = {
            "name": "New lab",
            "principal_investigator_name": "Jane Smith",
            "institution": "New institution",
            "contact_email": "*****@*****.**",
            "contact_phone": "(123) 456-7890",
            "lab_website": "https://mit.edu",
            "description": "ABCDEFG",
            "irb_contact_info": "how to reach the IRB",
            "approved_to_test": True,
        }
        page = self.client.post(self.lab_update_url, post_data)
        updated_lab = Lab.objects.get(pk=self.lab.pk)
        self.assertFalse(
            updated_lab.approved_to_test,
            "Researcher approved lab to test without permission",
        )

    # Lab update view: can update approved_to_test as admin
    def testPostLabUpdateViewEditApprovalAsAdmin(self):
        assign_perm(LabPermission.EDIT_LAB_APPROVAL.prefixed_codename, self.researcher)
        assign_perm(LabPermission.EDIT_LAB_METADATA.prefixed_codename, self.researcher)
        self.client.force_login(self.researcher)
        post_data = {
            "name": "New lab",
            "principal_investigator_name": "Jane Smith",
            "institution": "New institution",
            "contact_email": "*****@*****.**",
            "contact_phone": "(123) 456-7890",
            "lab_website": "https://mit.edu",
            "description": "ABCDEFG",
            "irb_contact_info": "how to reach the IRB",
            "approved_to_test": True,
        }
        page = self.client.post(self.lab_update_url, post_data)
        updated_lab = Lab.objects.get(pk=self.lab.pk)
        self.assertEqual(page.status_code, 302)
        self.assertTrue(
            updated_lab.approved_to_test,
            "Researcher could not approve lab to test despite permission",
        )

    # Lab membership request: can make as researcher
    def testRequestLabMembershipAsResearcher(self):
        self.client.force_login(self.researcher)
        page = self.client.post(self.lab2_request_url, {})
        self.assertEqual(
            page.status_code, 302, "Unable to request lab membership as researcher"
        )
        self.assertIn(self.researcher, self.lab2.requested_researchers.all())
        self.assertNotIn(self.researcher, self.lab2.researchers.all())

    # Lab membership request: cannot make as participant
    def testRequestLabMembershipAsParticipant(self):
        self.client.force_login(self.participant)
        page = self.client.post(self.lab2_request_url, {})
        self.assertEqual(
            page.status_code, 403, "Participant is able to request lab membership!"
        )