예제 #1
0
    def test_status_categories(self):
        self.assertFalse(is_informational(99))
        self.assertTrue(is_informational(100))
        self.assertTrue(is_informational(199))
        self.assertFalse(is_informational(200))

        self.assertFalse(is_success(199))
        self.assertTrue(is_success(200))
        self.assertTrue(is_success(299))
        self.assertFalse(is_success(300))

        self.assertFalse(is_redirect(299))
        self.assertTrue(is_redirect(300))
        self.assertTrue(is_redirect(399))
        self.assertFalse(is_redirect(400))

        self.assertFalse(is_client_error(399))
        self.assertTrue(is_client_error(400))
        self.assertTrue(is_client_error(499))
        self.assertFalse(is_client_error(500))

        self.assertFalse(is_server_error(499))
        self.assertTrue(is_server_error(500))
        self.assertTrue(is_server_error(599))
        self.assertFalse(is_server_error(600))
예제 #2
0
    def test_survey_response_smoke_test(self, survey_response):
        client = Client()

        username = "******"
        email = "*****@*****.**"
        password = "******"

        u = User.objects.create_user(username, email, password)

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

        response = client.post(reverse("response-list"), json.dumps(survey_response), content_type="application/json")

        self.assertFalse(status.is_server_error(response.status_code), response.json())

        # Make a survey
        s = {"owner": u.id, "name": "a title", "schema": EXAMPLE_SCHEMA}
        response = client.post(reverse("survey-list"), json.dumps(s), content_type="application/json")

        self.assertTrue(status.is_success(response.status_code), response.content)

        # Upload the result again

        survey_response["survey"] = response.json()["id"]

        response = client.post(reverse("response-list"), json.dumps(survey_response), content_type="application/json")

        self.assertTrue(status.is_success(response.status_code), response.content)
        self.crawl("http://testserver" + reverse("api-root"), seen=[])
예제 #3
0
 def test_get(self):
     """
     GET should not work.
     """
     response = self.client.get('/')
     self.assertFalse(status.is_success(response.status_code))
     response = self.client.get('/test')
     self.assertFalse(status.is_success(response.status_code))
예제 #4
0
    def test_url_available(self):
        print "\n Try if the links are available\n" \
            "Expect to get the success code\n"
        index_url = reverse("index")
        response = self.client.get(index_url)
        self.assertTrue(status.is_success(response.status_code))
        print "got index\n"

        post_list_url = reverse("post-list")
        response = self.client.get(post_list_url)
        self.assertTrue(status.is_success(response.status_code))
        print "got api blog list\n"
def test_add_term_to_taxonomy():
    # TODO: Use API to create taxonomy
    taxonomy = TaxonomyFactory(name='Test Ebola Questions')

    response1 = add_term(taxonomy=taxonomy.slug, name='Vaccine')
    response2 = add_term(taxonomy=taxonomy.slug, name='Time')

    assert status.is_success(response1.status_code), response1.data
    assert status.is_success(response2.status_code), response2.data
    terms = get_terms(taxonomy.slug).data
    assert len(terms) == 2

    assert all(term['taxonomy'] == taxonomy.slug for term in terms)
def get_taxonomies():
    request = APIRequestFactory().get("")
    view = TaxonomyViewSet.as_view(actions={'get': 'list'})
    response = view(request)
    assert status.is_success(response.status_code), response.data

    return response
def create_item(**kwargs):
    request = APIRequestFactory().post('/items', kwargs)
    view = ItemViewSet.as_view(actions={'post': 'create'})
    response = view(request)
    assert status.is_success(response.status_code), response.data

    return response
def get_terms(taxonomy_slug):
    request = APIRequestFactory().get("", data={'taxonomy': taxonomy_slug})
    view = TermViewSet.as_view(actions={'get': 'list'})
    response = view(request)
    assert status.is_success(response.status_code), response.data

    return response
예제 #9
0
파일: test_files.py 프로젝트: TipOfit/wq.db
    def test_files_direct_upload(self):
        filename = os.path.join(os.path.dirname(__file__), "testimage.png")
        with open(filename, 'rb') as f:
            response = self.client.post('/files.json', {"file": f})
            self.assertTrue(
                status.is_success(response.status_code), response.data
            )
            fileid = response.data['id']

            # is_image model/serializer property should be set
            self.assertEqual(response.data['is_image'], True)

        # File should not still be open after upload is completed
        instance = File.objects.get(pk=fileid)
        self.assertTrue(instance.file.closed)

        # Width and height on images should be set automatically
        self.assertEqual(instance.width, 1)
        self.assertEqual(instance.height, 1)

        # If mimetype parameter is accessed after file is saved, the mimetype
        # should come from the FileType and the actual file should not be
        # read again.
        del instance.file._file
        self.assertEqual(instance.mimetype, "image/png")
        self.assertFalse(hasattr(instance.file, "_file"))
예제 #10
0
파일: test_files.py 프로젝트: TipOfit/wq.db
    def test_files_attachment_multi(self):
        filename1 = os.path.join(os.path.dirname(__file__), "testimage.png")
        filename2 = os.path.join(os.path.dirname(__file__), "version.txt")
        with open(filename1, 'rb') as f1:
            with open(filename2, 'rb') as f2:
                response = self.client.post('/photoattachedmodels.json', {
                    "name": "Test Photo",
                    "photos": [f1, f2]
                })
                self.assertTrue(
                    status.is_success(response.status_code), response.data
                )
                self.assertEqual(response.data['name'], "Test Photo")
                self.assertIn("photos", response.data)
                self.assertEqual(len(response.data['photos']), 2)
                photo = None
                text = None
                for row in response.data['photos']:
                    if row['is_image']:
                        photo = row
                    else:
                        text = row
                self.assertEqual(photo['width'], 1)
                self.assertEqual(photo['name'], "testimage.png")
                self.assertIn("photos/testimage", photo['file'])

                self.assertEqual(text['width'], None)
                self.assertEqual(text['name'], "version.txt")
                self.assertIn("photos/version", text['file'])
예제 #11
0
파일: test_post.py 프로젝트: wq/wq.db
    def test_rest_custom_lookup_fk(self):
        SlugModel.objects.create(
            code='test1',
            name='Test #1',
        )
        response = self.client.post('/slugrefparents.json', {
            'ref_id': 'test1',
            'name': "Test FK",
        })
        self.assertTrue(status.is_success(response.status_code), response.data)
        rid = response.data.get('id')
        self.assertEqual(response.data, {
            'id': rid,
            'label': 'Test FK (Test #1)',
            'name': 'Test FK',
            'ref_id': 'test1',
            'ref_label': 'Test #1',
        })

        response = self.client.post('/slugrefparents.json', {
            'ref_id': 'test_invalid',
            'name': "Test FK",
        })
        self.assertTrue(
            status.is_client_error(response.status_code), response.data
        )
        self.assertEqual(response.data, {
            'ref_id': ['Object with code=test_invalid does not exist.']
        })
 def test_activities_endpoint(self):
     url = reverse('activities:activity-list')
     expect_url = '/api/activities/'
     msg = 'activities endpoint should be located at {0}'
     assert url == expect_url, msg.format(expect_url)
     response = self.c.get(url)
     self.assertTrue(status.is_success(response.status_code))
예제 #13
0
def add_terms(item_id, taxonomy_slug, names):
    """ Add named terms `names` within the Taxonomy with `taxonomy_slug` to the
    Item with id `item_id`

    args:
        item_id: e.g. 67
        taxonomy_slug: e.g. 'ebola-questions'
        names: names of terms in the Taxonomy with given slug

    returns:
        response from the server

    raises:
       TransportException on failure

    The taxonomy must already exist. If the taxonomy is open, any terms that
    do not exist will be created, otherwise an exception will be raised.
    """
    view = get_view({'post': 'add_terms'})

    terms = {'taxonomy': taxonomy_slug, 'name': names}
    request = request_factory.post('', terms)
    response = view(request, item_pk=item_id)

    if status.is_success(response.status_code):
        return response.data
    else:
        response.data['status_code'] = response.status_code
        response.data['terms'] = terms
        response.data['item_id'] = item_id
        raise TransportException(response.data)

    return response.data
 def test_activity_detail_endpoint(self):
     url = reverse('activities:activity-detail', args={self.activity.pk})
     msg = 'activity detail endpoint should be located at {0}'
     expect_url = '/api/activities/{}/'.format(self.activity.pk)
     assert url == expect_url, msg.format(expect_url)
     response = self.c.get(url)
     self.assertTrue(status.is_success(response.status_code))
예제 #15
0
def list(**kwargs):
    """ Return a list of Terms

    If keyword arguments are given, they are used
    to filter the terms. This can be used to list
    the terms in a given taxonomy.

    Args:
        **kwargs: Filters
    Returns:
        list: List of terms
    Raises:
        TransportException: On transport failure.
            'status_code' is set to the response
            status code.
    """
    view = get_view(actions={'get': 'list'})
    request = request_factory.get("", kwargs)
    response = view(request)

    if not status.is_success(response.status_code):
        response.data['status_code'] = response.status_code
        raise TransportException(response.data)

    return response.data
예제 #16
0
파일: test_rest.py 프로젝트: wq/wq.db
    def test_rest_cache_filter(self):
        other_user = User.objects.create(username='******')
        UserManagedModel.objects.create(id=2, user=other_user)
        UserManagedModel.objects.create(id=3, user=other_user)

        for auth in False, True:
            if auth:
                self.client.force_authenticate(self.user)

            tests = [
                (3, 1 if auth else 0, '/usermanagedmodels.json'),
                (3, 3, '/usermanagedmodels/'),
                (3, 3, '/usermanagedmodels.json?page=1'),
                (1, 1, '/usermanagedmodels.json?user_id=%s' % self.user.pk),
                (2, 2, '/usermanagedmodels.json?user_id=%s' % other_user.pk),
            ]
            for expect_count, expect_items, url in tests:
                response = self.client.get(url)
                self.assertTrue(
                    status.is_success(response.status_code), response.data
                )
                self.assertEqual(
                    len(response.data['list']), expect_items,
                    "%s should return %s items for %s" % (
                        url, expect_items,
                        "authed user" if auth else "anonymous user"
                    )
                )
                self.assertEqual(response.data['pages'], 1)
                self.assertEqual(response.data['per_page'], 50)
                self.assertEqual(response.data['count'], expect_count)
예제 #17
0
 def test_marker_collection(self, mock_serializer):
     map_id = 1
     returnvalue = {"id": 1,
                    "canvas_course_id": 73,
                    "title": "title",
                    "latitude": "43",
                    "longitude": "72",
                    "zoom": 4,
                    "maptype": 1,
                    "thumbnail": "https://maps.googleapis.com/maps/api/staticmap?center=43,72&zoom=4&size=200x150&maptype=satellite",
                    "markers": [{"title": "title",
                                 "map": 1,
                                 "latitude": "24",
                                 "longitude": "25",
                                 "description": "description",
                                 "external_url": "blank",
                                 "created_by_id": "huid",
                                 "created_by_full_name": "name",
                                 "modified_by_id": "huid",
                                 "date_created": "2015-09-12T03:26:23.222000Z",
                                 "date_modified": "2015-09-12T03:26:23.222000Z"}],
                    "date_created": "2015-09-12T03:26:23.222000Z",
                    "date_modified": "2015-09-12T03:26:23.222000Z",
                    "created_by_id": "huid",
                    "created_by_full_name": "name",
                    "modified_by_id": "huid",
                    "description": "description"}
     mock_serializer.return_value = SerializerStub(returnvalue)
     result = map_location(self.request, map_id)
     self.assertTrue(status.is_success(result.status_code))
     self.assertEqual(json.loads(result.render().content), returnvalue)
예제 #18
0
    def test_initiator_zero_reason_behaviours(self):
        """Evaluate whether trades with zero value are properly accepted
        and commenting rules enforced"""

        Scenario = namedtuple('Scenario',
                              ['create_draft_first', 'zero_reason', 'create_a_comment'])
        Results = namedtuple('Results', ['saving_draft_succeeds', 'proposing_trade_succeeds'])

        expected_results = {}

        expected_results[Scenario(True, self.zero_reason['other'], False)] = Results(True, False)
        expected_results[Scenario(True, self.zero_reason['other'], True)] = Results(True, True)
        expected_results[Scenario(False, self.zero_reason['other'], None)] = Results(None, False)

        expected_results[Scenario(False, self.zero_reason['affiliate'], None)]\
            = Results(None, True)
        expected_results[Scenario(True, self.zero_reason['affiliate'], False)]\
            = Results(True, True)
        expected_results[Scenario(True, self.zero_reason['affiliate'], True)]\
            = Results(True, True)

        expected_results[Scenario(False, None, None)] = Results(None, False)
        expected_results[Scenario(True, None, False)] = Results(False, False)
        expected_results[Scenario(True, None, True)] = Results(False, False)

        initiating_org = self.users[
            self.user_map[
                self.UserRelationship.INITIATOR
            ]].organization

        responding_org = self.users[
            self.user_map[
                self.UserRelationship.RESPONDENT
            ]].organization

        for scenario, result in expected_results.items():
            with self.subTest("evaluating scenario",
                              scenario=scenario,
                              res=result):
                payload = {
                    'fairMarketValuePerCredit': 0.0,
                    'initiator': initiating_org.id,
                    'numberOfCredits': 1,
                    'respondent': responding_org.id,
                    'tradeEffectiveDate': datetime.datetime.today().strftime('%Y-%m-%d'),
                    'type': self.credit_trade_types['sell'].id,
                    'zeroReason': scenario.zero_reason.id if scenario.zero_reason else None,
                }

                if scenario.create_draft_first:
                    payload['status'] = self.statuses['draft'].id
                    response = self.clients[self.user_map[self.UserRelationship.INITIATOR]].post(
                        '/api/credit_trades',
                        content_type='application/json',
                        data=json.dumps(payload)
                    )
                    self.assertEqual(status.is_success(response.status_code),
                                     result.saving_draft_succeeds)

                    ct_id = response.data['id'] if 'id' in response.data else None

                    if scenario.create_a_comment and result.saving_draft_succeeds:
                        response = self.clients[self.user_map[self.UserRelationship.INITIATOR]]. \
                            post(
                            '/api/comments',
                            content_type='application/json',
                            data=json.dumps({
                                "comment": "explanatory comment",
                                "creditTrade": ct_id,
                                "privilegedAccess": False
                            })
                        )
                        self.assertTrue(status.is_success(response.status_code))

                    if result.saving_draft_succeeds:

                        payload['status'] = self.statuses['submitted'].id

                        response = self.clients[self.user_map[self.UserRelationship.INITIATOR]]. \
                            put(
                            '/api/credit_trades/{}'.format(ct_id),
                            content_type='application/json',
                            data=json.dumps(payload)
                            )
                        self.assertEqual(status.is_success(response.status_code),
                                         result.proposing_trade_succeeds)
                else:
                    payload['status'] = self.statuses['submitted'].id
                    response = self.clients[self.user_map[self.UserRelationship.INITIATOR]].post(
                        '/api/credit_trades',
                        content_type='application/json',
                        data=json.dumps(payload)
                    )
                    self.assertEqual(status.is_success(response.status_code),
                                     result.proposing_trade_succeeds)
예제 #19
0
 def test_rest_default_per_page(self):
     response = self.client.get('/parents.json')
     self.assertTrue(status.is_success(response.status_code), response.data)
     self.assertEqual(response.data['per_page'], 50)
예제 #20
0
    def test_create_random_column_datetime_form(self):
        """Create a random number column with no values"""
        # Get the workflow first
        self.workflow = models.Workflow.objects.all().first()

        # Column name and current number of them
        cname = 'random_column'
        ncols = self.workflow.ncols

        # JSON POST request for column creation with incorrect string value
        resp = self.get_response('column:random_column_add',
                                 method='POST',
                                 req_params={
                                     'name': cname,
                                     'data_type': 'datetime',
                                     'raw_categories': 'bogus',
                                     'position': 0
                                 },
                                 is_ajax=True)

        resp_content = json.loads(resp.content)
        self.assertTrue('html_form' in resp_content)
        self.assertTrue(status.is_success(resp.status_code))
        self.workflow.refresh_from_db()
        self.assertEqual(self.workflow.ncols, ncols)
        new_column = self.workflow.columns.filter(name=cname).first()
        self.assertIsNone(new_column)

        # JSON POST request for column creation with a single integer
        resp = self.get_response('column:random_column_add',
                                 method='POST',
                                 req_params={
                                     'name': cname,
                                     'data_type': 'datetime',
                                     'raw_categories':
                                     '2020-09-11 12:04:43+0930',
                                     'position': 0
                                 },
                                 is_ajax=True)

        resp_content = json.loads(resp.content)
        self.assertTrue('html_form' in resp_content)
        self.assertTrue(status.is_success(resp.status_code))
        self.workflow.refresh_from_db()
        self.assertEqual(self.workflow.ncols, ncols)
        new_column = self.workflow.columns.filter(name=cname).first()
        self.assertIsNone(new_column)

        # JSON POST request for column creation with a multiple strings
        dtimes = [
            parse_datetime('2020-09-11 12:04:43+0930'),
            parse_datetime('2020-09-12 12:04:43+0930')
        ]
        resp = self.get_response(
            'column:random_column_add',
            method='POST',
            req_params={
                'name': cname,
                'data_type': 'datetime',
                'raw_categories':
                '2020-09-11 12:04:43+0930, 2020-09-12 12:04:43+0930',
                'position': 0
            },
            is_ajax=True)

        resp_content = json.loads(resp.content)
        self.assertTrue('html_form' not in resp_content)
        self.assertTrue(status.is_success(resp.status_code))
        self.workflow.refresh_from_db()
        self.assertEqual(self.workflow.ncols, ncols + 1)
        new_column = self.workflow.columns.filter(name=cname).first()
        self.assertIsNotNone(new_column)
        self.assertEqual(new_column.name, cname)
        self.assertEqual(new_column.data_type, 'datetime')
        data_frame = pandas.load_table(
            self.workflow.get_data_frame_table_name())
        self.assertTrue(all(element in dtimes
                            for element in data_frame[cname]))
        # Delete the column
        services.delete_column(self.workflow.user, self.workflow, new_column)
예제 #21
0
 def test_rest_custom_lookup(self):
     response = self.client.get('/slugmodels/test.json')
     self.assertTrue(status.is_success(response.status_code), response.data)
     self.assertEqual(response.data['id'], 'test')
예제 #22
0
    def test_sql_update_create(self):
        """Create a new SQL Scheduled operation."""

        initial_df = self.workflow.data_frame()

        # Create the new table in the DB for the scheduled operation
        with connection.connection.cursor() as cursor:
            # Add the extra table to the database for the merge
            for query, fields in SQL_QUERIES:
                cursor.execute(query, fields)

        # Save some current variables for future checks
        current_ops = models.ScheduledOperation.objects.count()
        current_tasks = PeriodicTask.objects.count()
        current_nrows = self.workflow.nrows
        current_columns = self.workflow.ncols

        # Index page should be ok
        resp = self.get_response('scheduler:index')
        self.assertTrue(status.is_success(resp.status_code))

        # GET the page to select the SQL connection
        resp = self.get_response('scheduler:select_sql')
        self.assertTrue(status.is_success(resp.status_code))
        for sql_conn in models.SQLConnection.objects.all():
            self.assertTrue(sql_conn.name in str(resp.content))

        # Get the connection pointing to localhost
        sql_conn = models.SQLConnection.objects.get(name='remote server 2')

        # Modify connection to point to the test DB
        sql_conn.db_name = settings.DATABASE_URL['NAME']
        sql_conn.save(update_fields=['db_name'])

        # GET the form to create the scheduled SQL operation
        resp = self.get_response('scheduler:sqlupload',
                                 {'pk': str(sql_conn.id)})
        self.assertTrue(status.is_success(resp.status_code))

        # POST incorrect form without a dst key
        resp = self.get_response('scheduler:sqlupload',
                                 {'pk': str(sql_conn.id)},
                                 method='POST',
                                 req_params={
                                     'name': 'schedule sql upload',
                                     'execute': '05/31/2999 14:35',
                                     'src_key': 'email',
                                     'how_merge': 'outer',
                                     'db_password': '******'
                                 })
        self.assertTrue(status.is_success(resp.status_code))
        self.assertIn('operation requires the names', str(resp.content))

        # POST incorrect form without a src key
        resp = self.get_response('scheduler:sqlupload',
                                 {'pk': str(sql_conn.id)},
                                 method='POST',
                                 req_params={
                                     'name': 'schedule sql upload',
                                     'execute': '05/31/2999 14:35',
                                     'dst_key': 'email',
                                     'how_merge': 'outer',
                                     'db_password': '******'
                                 })
        self.assertTrue(status.is_success(resp.status_code))
        self.assertIn('operation requires the names', str(resp.content))

        # POST incorrect form without a non-existent dst_key
        resp = self.get_response('scheduler:sqlupload',
                                 {'pk': str(sql_conn.id)},
                                 method='POST',
                                 req_params={
                                     'name': 'schedule sql upload',
                                     'execute': '05/31/2999 14:35',
                                     'dst_key': 'INCORRECT NAME',
                                     'src_key': 'email',
                                     'how_merge': 'outer',
                                     'db_password': '******'
                                 })
        self.assertTrue(status.is_success(resp.status_code))
        self.assertIn('is not a key column', str(resp.content))

        # POST incorrect form without an incorrect dst_key
        resp = self.get_response('scheduler:sqlupload',
                                 {'pk': str(sql_conn.id)},
                                 method='POST',
                                 req_params={
                                     'name': 'schedule sql upload',
                                     'execute': '05/31/2999 14:35',
                                     'dst_key': 'Gender',
                                     'src_key': 'email',
                                     'how_merge': 'outer',
                                     'db_password': '******'
                                 })
        self.assertTrue(status.is_success(resp.status_code))
        self.assertIn('is not a key column', str(resp.content))

        # POST incorrect form without a merge method
        resp = self.get_response('scheduler:sqlupload',
                                 {'pk': str(sql_conn.id)},
                                 method='POST',
                                 req_params={
                                     'name': 'schedule sql upload',
                                     'execute': '05/31/2999 14:35',
                                     'dst_key': 'Gender',
                                     'src_key': 'email',
                                     'db_password': '******'
                                 })
        self.assertTrue(status.is_success(resp.status_code))
        self.assertIn('requires a merge method', str(resp.content))

        # POST the correct form to create the SQL operation
        resp = self.get_response('scheduler:sqlupload',
                                 {'pk': str(sql_conn.id)},
                                 method='POST',
                                 req_params={
                                     'name': 'schedule sql upload',
                                     'execute': '05/31/2999 14:35',
                                     'dst_key': 'email',
                                     'src_key': 'email',
                                     'how_merge': 'outer',
                                     'db_password': '******'
                                 })
        self.assertTrue(status.is_success(resp.status_code))
        self.assertEqual(current_ops + 1,
                         models.ScheduledOperation.objects.count())

        # Execute the operation
        s_item = self.workflow.scheduled_operations.get(
            name='schedule sql upload')
        tasks.execute_scheduled_operation(s_item.id)

        # Verify the result of the operation
        s_item.refresh_from_db()
        self.workflow.refresh_from_db()

        # Identical number of tasks pending than at the start
        self.assertEqual(current_tasks + 1, PeriodicTask.objects.count())

        # Operation must have status equal to DONE
        self.assertEqual(s_item.status, models.scheduler.STATUS_DONE)

        # Operation execution time must be reflected in the log field
        self.assertIsNotNone(s_item.last_executed_log)

        # Number of rows and columns in workflow has changed
        self.assertEqual(self.workflow.nrows, current_nrows + 3)
        self.assertEqual(self.workflow.ncols, current_columns + 1)

        # New column with the right name and type
        new_column = self.workflow.columns.filter(name='NEW COLUMN').first()
        self.assertIsNotNone(new_column)
        self.assertEqual(new_column.data_type, 'double')
        result_df = self.workflow.data_frame()

        # New rows with the right email
        email_values = list(result_df['email'])
        self.assertIn('*****@*****.**', email_values)
        self.assertIn('*****@*****.**', email_values)
        self.assertIn('*****@*****.**', email_values)

        # Columns with the right value
        old_hecs_count = initial_df['Enrolment Type'].loc[
            initial_df['Enrolment Type'] == 'Local'].count()
        new_hecs_count = result_df['Enrolment Type'].loc[
            result_df['Enrolment Type'] == 'Local'].count()
        self.assertEqual(old_hecs_count + 6, new_hecs_count)
        self.assertEqual(result_df['NEW COLUMN'].count(), 6)
예제 #23
0
 def test_rest_detail_at_root(self):
     response = self.client.get('/instance.json')
     self.assertTrue(status.is_success(response.status_code), response.data)
     self.assertTrue(response.data['description'] == "Test")
예제 #24
0
 def test_rest_list_at_root(self):
     response = self.client.get("/.json")
     self.assertTrue(status.is_success(response.status_code), response.data)
     self.assertTrue(len(response.data['list']) == 1)
예제 #25
0
 def test_rest_limit(self):
     response = self.client.get('/children.json?limit=10')
     self.assertTrue(status.is_success(response.status_code), response.data)
     self.assertEqual(response.data['per_page'], 10)
예제 #26
0
 def test_get_todos_success(self):
     """ GET with auth should return a 2XX """
     self.client.force_authenticate(self.user)
     response = self.client.get(self.URL)
     self.assertTrue(status.is_success(response.status_code))
예제 #27
0
def test_home():
    response = http.get(path='/')
    assert status.is_success(response.status_code)
예제 #28
0
    def test_schedule_email(self):
        action_name = 'simple action'

        s_subject = 'subject'
        # Get list of workflows
        response = self.client.get(reverse('scheduler:api_scheduled_email'))

        self.assertEqual(response.data['count'], 0)
        self.assertEqual(response.data['next'], None)
        self.assertEqual(response.data['previous'], None)

        # Get the action
        action = models.Action.objects.get(name=action_name,
                                           workflow__name='wflow1')

        # Schedule one of the actions
        response = self.client.post(reverse('scheduler:api_scheduled_email'), {
            'name': self.s_name,
            'description_text': self.s_desc,
            'operation_type': 'action_run_personalized_email',
            'workflow': action.workflow.id,
            'action': action.id,
            'execute': self.s_execute,
            'payload': {
                'item_column': 'email',
                'subject': s_subject,
                'cc_email': '',
                'bcc_email': '',
                'track_read': False,
                'send_confirmation': False,
            },
        },
                                    format='json')

        # Element has been scheduled
        self.assertEqual(response.status_code, 201)

        sch_item = models.ScheduledOperation.objects.get(action=action)
        self.assertEqual(sch_item.name, self.s_name)
        self.assertEqual(sch_item.description_text, self.s_desc)
        self.assertEqual(sch_item.action, action)
        self.assertEqual(sch_item.payload['subject'], s_subject)

        # Update the element
        response = self.client.put(reverse(
            'scheduler:api_rud_email', kwargs={'pk': sch_item.id}), {
                'name': self.s_name + '2',
                'description_text': self.s_desc,
                'operation_type': 'action_run_personalized_email',
                'workflow': action.workflow.id,
                'action': action.id,
                'execute': self.s_execute,
                'payload': {
                    'item_column': 'email',
                    'subject': s_subject,
                    'cc_email': '',
                    'bcc_email': '',
                    'track_read': False,
                    'send_confirmation': False
                }
            },
                                   format='json')

        # Element has been scheduled
        self.assertTrue(status.is_success(response.status_code))

        sch_item = models.ScheduledOperation.objects.get(action=action)
        self.assertEqual(sch_item.name, self.s_name + '2')

        # Delete the element
        response = self.client.delete(
            reverse('scheduler:api_rud_email', kwargs={'pk': sch_item.id}))
        self.assertEqual(response.status_code, 204)
예제 #29
0
    def test_request_get(self):
        self.get_new_band()
        response = self.api_client.get(self.url)

        assert status.is_success(response.status_code)
        assert len(response.json()['results']) >= 1
 def test_accounts_device_get(self):
     data = {
         'id': 'test-device-id',
     }
     response = client.get('/accounts/device', data=data, follow=True)
     assert status.is_success(response.status_code)
예제 #31
0
    def test_schedule_json(self):
        action_name = 'json action'
        # Get list of workflows
        response = self.client.get(reverse('scheduler:api_scheduled_json'))

        self.assertEqual(response.data['count'], 0)
        self.assertEqual(response.data['next'], None)
        self.assertEqual(response.data['previous'], None)

        # Get the action
        action = models.Action.objects.get(name=action_name,
                                           workflow__name='wflow1')

        # Schedule one of the actions
        response = self.client.post(reverse('scheduler:api_scheduled_json'), {
            'name': self.s_name,
            'description_text': self.s_desc,
            'operation_type': 'action_run_personalized_json',
            'workflow': action.workflow.id,
            'action': action.id,
            'execute': self.s_execute,
            'payload': {
                'item_column': 'email',
                'token': 'whatever',
                'field1': 'value1',
                'field2': 'value2',
            },
        },
                                    format='json')

        # Element has been created
        self.assertEqual(response.status_code, 201)

        sch_item = models.ScheduledOperation.objects.get(action=action)
        self.assertEqual(sch_item.name, self.s_name)
        self.assertEqual(sch_item.description_text, self.s_desc)
        self.assertEqual(sch_item.action, action)

        # Update the element
        response = self.client.put(reverse(
            'scheduler:api_rud_json', kwargs={'pk': sch_item.id}), {
                'name': self.s_name + '2',
                'description_text': self.s_desc,
                'operation_type': 'action_run_personalized_json',
                'workflow': action.workflow.id,
                'action': action.id,
                'execute': self.s_execute,
                'payload': {
                    'item_column': 'email',
                    'token': 'whatever',
                    'field1': 'value1',
                    'field2': 'value2',
                },
            },
                                   format='json')

        # Element has been scheduled
        self.assertTrue(status.is_success(response.status_code))

        sch_item = models.ScheduledOperation.objects.get(action=action)
        self.assertEqual(sch_item.name, self.s_name + '2')

        # Delete the element
        response = self.client.delete(
            reverse('scheduler:api_rud_json', kwargs={'pk': sch_item.id}))
        self.assertEqual(response.status_code, 204)

        # Schedule the action with the wrong function
        response = self.client.post(reverse('scheduler:api_scheduled_email'), {
            'name': self.s_name,
            'description_text': self.s_desc,
            'operation_type': 'action_run_personalized_json',
            'workflow': action.workflow.id,
            'action': action.id,
            'execute': self.s_execute,
            'payload': {
                'item_column': 'email',
                'token': 'whatever',
                'field1': 'value1',
                'field2': 'value2',
            },
        },
                                    format='json')

        # Element has NOT been created
        self.assertEqual(response.status_code, 500)
예제 #32
0
def download_worker(request, url, filepath):
    taskname = request.GET.get('taskname', '')
    if taskname == 'aio_update':
        logtype = OperationLog.TYPE_UPDATE_AIO_BASE
    if taskname == 'iso_update':
        logtype = OperationLog.TYPE_UPDATE_AIO_ISO
    if taskname == 'driver_update':
        logtype = OperationLog.TYPE_UPDATE_AIO_DRIVE

    r = requests.get(url, stream=True, verify=False)
    if not status.is_success(r.status_code):
        SaveOperationLog(
            request.user, logtype,
            json.dumps(
                {
                    '失败': '下载文件失败,状态码:{}'.format(r.status_code),
                    '文件名': '{}'.format(url)
                },
                ensure_ascii=False), get_operator(request))
        _logger.error('下载文件失败,状态码:{}'.format(r.status_code))
        return
    SaveOperationLog(
        request.user, logtype,
        json.dumps({
            '状态': '开始下载文件',
            '文件名': '{}'.format(url)
        },
                   ensure_ascii=False), get_operator(request))

    lastsize = 0
    size = 0
    bneedlog = True
    with open(filepath, 'wb') as fd:
        for chunk in r.iter_content(1024 * 1024):
            size += len(chunk)
            fd.write(chunk)
            bneedlog = True
            if size >= lastsize + 100 * 1024 * 1024:
                SaveOperationLog(
                    request.user, logtype,
                    json.dumps(
                        {'下载状态': '已下载:{:.1f}MB'.format(size / (1024 * 1024))},
                        ensure_ascii=False), get_operator(request))
                bneedlog = False
                lastsize = size

    if bneedlog:
        SaveOperationLog(
            request.user, logtype,
            json.dumps({'下载状态': '已下载:{:.1f}MB'.format(size / (1024 * 1024))},
                       ensure_ascii=False), get_operator(request))

    _logger.info(
        'download update file finish and bigin execute update, filepath:{}'.
        format(filepath))
    g_thread_handle.setName('processing_' + taskname)
    # 判断是否 执行更新操作
    if getattr(threading.current_thread(), 'do_run', True):
        processupload(filepath, request.user, get_operator(request))
        try:
            os.remove(filepath)
        except:
            pass
        SaveOperationLog(
            request.user, logtype,
            json.dumps({
                '状态': '更新完成',
                '文件名': '{}'.format(url)
            },
                       ensure_ascii=False), get_operator(request))
    else:
        _logger.info(
            'download update file is finished, but task has been canceled and file will be remouved, filepath:{}'
            .format(filepath))
        SaveOperationLog(
            request.user, logtype,
            json.dumps({
                '状态': '下载完成,任务被取消,文件将删除',
                '文件名': '{}'.format(url)
            },
                       ensure_ascii=False), get_operator(request))
        try:
            os.remove(filepath)
        except:
            pass
        return
 def test_get_accounts_device_list(self):
     response = client.get('/accounts/device/list')
     assert status.is_success(response.status_code)
예제 #34
0
    def test_create_random_column_number_form(self):
        """Create a random number column with no values"""
        # Get the workflow first
        self.workflow = models.Workflow.objects.all().first()

        # Column name and current number of them
        cname = 'random_column'
        ncols = self.workflow.ncols

        # JSON POST request for column creation with string value
        resp = self.get_response('column:random_column_add',
                                 method='POST',
                                 req_params={
                                     'name': cname,
                                     'data_type': 'double',
                                     'raw_categories': 'bogus',
                                     'position': 0
                                 },
                                 is_ajax=True)

        resp_content = json.loads(resp.content)
        self.assertTrue('html_form' in resp_content)
        self.assertTrue(status.is_success(resp.status_code))
        self.workflow.refresh_from_db()
        self.assertEqual(self.workflow.ncols, ncols)
        new_column = self.workflow.columns.filter(name=cname).first()
        self.assertIsNone(new_column)

        # JSON POST request for column creation with a single integer
        resp = self.get_response('column:random_column_add',
                                 method='POST',
                                 req_params={
                                     'name': cname,
                                     'data_type': 'double',
                                     'raw_categories': '13.0',
                                     'position': 0
                                 },
                                 is_ajax=True)

        resp_content = json.loads(resp.content)
        self.assertTrue('html_form' in resp_content)
        self.assertTrue(status.is_success(resp.status_code))
        self.workflow.refresh_from_db()
        self.assertEqual(self.workflow.ncols, ncols)
        new_column = self.workflow.columns.filter(name=cname).first()
        self.assertIsNone(new_column)

        # JSON POST request for column creation with a multiple strings
        resp = self.get_response('column:random_column_add',
                                 method='POST',
                                 req_params={
                                     'name': cname,
                                     'data_type': 'double',
                                     'raw_categories': 'one, two, three',
                                     'position': 0
                                 },
                                 is_ajax=True)

        resp_content = json.loads(resp.content)
        self.assertTrue('html_form' in resp_content)
        self.assertTrue(status.is_success(resp.status_code))
        self.workflow.refresh_from_db()
        self.assertEqual(self.workflow.ncols, ncols)
        new_column = self.workflow.columns.filter(name=cname).first()
        self.assertIsNone(new_column)

        # JSON POST request for column creation with a interval integer
        resp = self.get_response('column:random_column_add',
                                 method='POST',
                                 req_params={
                                     'name': cname,
                                     'data_type': 'double',
                                     'raw_categories': '-3.0 - -5.0',
                                     'position': 0
                                 },
                                 is_ajax=True)

        resp_content = json.loads(resp.content)
        self.assertTrue('html_form' not in resp_content)
        self.assertTrue(status.is_success(resp.status_code))
        self.workflow.refresh_from_db()
        self.assertEqual(self.workflow.ncols, ncols + 1)
        new_column = self.workflow.columns.filter(name=cname).first()
        self.assertIsNotNone(new_column)
        self.assertEqual(new_column.name, cname)
        self.assertEqual(new_column.data_type, 'double')
        data_frame = pandas.load_table(
            self.workflow.get_data_frame_table_name())
        self.assertTrue(
            all(element in [-3, -4, -5] for element in data_frame[cname]))
        # Delete the column
        services.delete_column(self.workflow.user, self.workflow, new_column)

        # JSON POST request for column creation with an integer list
        resp = self.get_response('column:random_column_add',
                                 method='POST',
                                 req_params={
                                     'name': cname,
                                     'data_type': 'double',
                                     'raw_categories': '17, 18, 19',
                                     'position': 0
                                 },
                                 is_ajax=True)

        resp_content = json.loads(resp.content)
        self.assertTrue('html_form' not in resp_content)
        self.assertTrue(status.is_success(resp.status_code))
        self.workflow.refresh_from_db()
        self.assertEqual(self.workflow.ncols, ncols + 1)
        new_column = self.workflow.columns.filter(name=cname).first()
        self.assertIsNotNone(new_column)
        self.assertEqual(new_column.name, cname)
        self.assertEqual(new_column.data_type, 'double')
        data_frame = pandas.load_table(
            self.workflow.get_data_frame_table_name())
        self.assertTrue(
            all(element in [17, 18, 19] for element in data_frame[cname]))
예제 #35
0
    def test_back_to_home_page(self):
        """Loop over all URLs and check they redirect appropriately."""
        redirect = [
            # Workflow
            reverse('workflow:detail'),
            reverse('workflow:operations'),
            reverse('workflow:column_move_top', kwargs={'pk': 1}),
            reverse('workflow:column_move_bottom', kwargs={'pk': 1}),
            # Action
            reverse('action:index'),
            reverse('action:timeline'),
            reverse('action:timeline', kwargs={'pk': 1}),
            reverse('action:edit', kwargs={'pk': 1}),
            reverse('action:export', kwargs={'pklist': '1'}),
            reverse('action:import'),
            reverse('action:item_filter'),
            reverse('action:run', kwargs={'pk': 1}),
            reverse('action:run_done'),
            reverse('action:zip_action', kwargs={'pk': 1}),
            reverse('action:unselect_column_action',
                    kwargs={
                        'pk': 1,
                        'cpk': 1
                    }),
            reverse('action:run_survey_row', kwargs={'pk': 1}),
            # Dataops
            reverse('dataops:uploadmerge'),
            reverse('dataops:transform'),
            reverse('dataops:model'),
            reverse('dataops:plugin_invoke', kwargs={'pk': 1}),
            reverse('dataops:rowupdate'),
            reverse('dataops:rowcreate'),
            reverse('dataops:csvupload_start'),
            reverse('dataops:excelupload_start'),
            reverse('dataops:googlesheetupload_start'),
            reverse('dataops:s3upload_start'),
            reverse('dataops:upload_s2'),
            reverse('dataops:upload_s3'),
            reverse('dataops:upload_s4'),
            reverse('dataops:sqlconns_index'),
            # reverse('dataops:athenaconns_instructor_index'),
            reverse('dataops:sqlupload_start', kwargs={'pk': 1}),
            # reverse('dataops:athenaupload_start', kwargs={'pk': 1}),
            # Logs
            reverse('logs:view', kwargs={'pk': 1}),
            # Table
            reverse('table:display_view', kwargs={'pk': 1}),
            reverse('table:view_index'),
            reverse('table:stat_column', kwargs={'pk': 1}),
            reverse('table:stat_table'),
            reverse('table:stat_table_view', kwargs={'pk': 1}),
            reverse('table:csvdownload'),
            reverse('table:csvdownload_view', kwargs={'pk': 1}),
        ]

        bad_request = [
            # Workflow
            reverse('workflow:column_ss'),
            reverse('workflow:attribute_create'),
            reverse('workflow:attribute_edit', kwargs={'pk': 0}),
            reverse('workflow:attribute_delete', kwargs={'pk': 0}),
            reverse('workflow:share_create'),
            # 'workflow:share_delete',
            reverse('workflow:column_add'),
            # 'workflow:question_add',
            reverse('workflow:question_add', kwargs={'pk': 1}),
            reverse('workflow:formula_column_add'),
            reverse('workflow:random_column_add'),
            reverse('workflow:column_delete', kwargs={'pk': 1}),
            reverse('workflow:column_edit', kwargs={'pk': 1}),
            # 'workflow:question_edit',
            reverse('workflow:column_clone', kwargs={'pk': 1}),
            reverse('workflow:column_move'),
            reverse('workflow:column_restrict', kwargs={'pk': 1}),
            # Action
            reverse('action:create'),
            reverse('action:save_text', kwargs={'pk': 1}),
            reverse('action:update', kwargs={'pk': 1}),
            reverse('action:clone_action', kwargs={'pk': 1}),
            reverse('action:delete', kwargs={'pk': 1}),
            reverse('action:select_key_column_action',
                    kwargs={
                        'pk': 1,
                        'cpk': 1,
                        'key': 1
                    }),
            reverse('action:select_column_action', kwargs={
                'pk': 1,
                'cpk': 1
            }),
            reverse('action:shuffle_questions', kwargs={'pk': 1}),
            reverse('action:edit_in_select_condition',
                    kwargs={
                        'pk': 1,
                        'condpk': 1
                    }),
            reverse('action:edit_in_select_condition', kwargs={'tpk': 1}),
            reverse('action:show_survey_table_ss', kwargs={'pk': 1}),
            reverse('action:preview', kwargs={
                'pk': 1,
                'idx': 0
            }),
            reverse('action:preview_all_false', kwargs={
                'pk': 1,
                'idx': 0
            }),
            reverse('action:showurl', kwargs={'pk': 1}),
            reverse('action:edit_description', kwargs={'pk': 1}),
            reverse('action:create_filter', kwargs={'pk': 1}),
            reverse('action:edit_filter', kwargs={'pk': 1}),
            reverse('action:delete_filter', kwargs={'pk': 1}),
            reverse('action:create_condition', kwargs={'pk': 1}),
            reverse('action:edit_condition', kwargs={'pk': 1}),
            reverse('action:delete_condition', kwargs={'pk': 1}),
            reverse('action:clone_condition', kwargs={'pk': 1}),
            reverse('action:clone_condition', kwargs={
                'pk': 1,
                'action_pk': 1
            }),
            # Dataops
            reverse('dataops:plugin_diagnose', kwargs={'pk': 1}),
            reverse('dataops:plugin_moreinfo', kwargs={'pk': 1}),
            reverse('dataops:sqlconn_view', kwargs={'pk': 1}),
            # reverse('dataops:athenaconn_view', kwargs={'pk': 1}),
            # Logs
            reverse('logs:display_ss'),
            # Table
            reverse('table:display_ss'),
            reverse('table:display_view_ss', kwargs={'pk': 1}),
            reverse('table:row_delete'),
            reverse('table:view_add'),
            reverse('table:stat_column_JSON', kwargs={'pk': 1}),
            reverse('table:view_edit', kwargs={'pk': 1}),
            reverse('table:view_clone', kwargs={'pk': 1}),
            reverse('table:view_delete', kwargs={'pk': 1}),
        ]

        self.client.login(email='*****@*****.**', password='******')

        resp = self.client.get(reverse('home'))
        self.assertTrue(status.is_success(resp.status_code))

        for url_name in redirect:
            resp = self.client.get(url_name)
            self.assertEqual(resp.status_code, status.HTTP_302_FOUND)
            self.assertEqual(resp.url, reverse('home'))

        for url_name in bad_request:
            resp = self.client.get(url_name)
            self.assertEqual(resp.status_code, 400)