Example #1
0
def test_create_row(api_client, data_fixture):
    user, jwt_token = data_fixture.create_user_and_token()
    table = data_fixture.create_database_table(user=user)
    table_2 = data_fixture.create_database_table()
    text_field = data_fixture.create_text_field(table=table,
                                                order=0,
                                                name="Color",
                                                text_default="white")
    number_field = data_fixture.create_number_field(table=table,
                                                    order=1,
                                                    name="Horsepower")
    boolean_field = data_fixture.create_boolean_field(table=table,
                                                      order=2,
                                                      name="For sale")
    text_field_2 = data_fixture.create_text_field(table=table,
                                                  order=3,
                                                  name="Description")

    token = TokenHandler().create_token(user, table.database.group, "Good")
    wrong_token = TokenHandler().create_token(user, table.database.group,
                                              "Wrong")
    TokenHandler().update_token_permissions(user, wrong_token, False, True,
                                            True, True)

    response = api_client.post(
        reverse("api:database:rows:list", kwargs={"table_id": 99999}),
        {f"field_{text_field.id}": "Test 1"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {jwt_token}",
    )
    assert response.status_code == HTTP_404_NOT_FOUND
    assert response.json()["error"] == "ERROR_TABLE_DOES_NOT_EXIST"

    response = api_client.post(
        reverse("api:database:rows:list", kwargs={"table_id": table.id}),
        {f"field_{text_field.id}": "Test 1"},
        format="json",
        HTTP_AUTHORIZATION="Token abc123",
    )
    assert response.status_code == HTTP_401_UNAUTHORIZED
    assert response.json()["error"] == "ERROR_TOKEN_DOES_NOT_EXIST"

    response = api_client.post(
        reverse("api:database:rows:list", kwargs={"table_id": table.id}),
        {f"field_{text_field.id}": "Test 1"},
        format="json",
        HTTP_AUTHORIZATION=f"Token {wrong_token.key}",
    )
    assert response.status_code == HTTP_401_UNAUTHORIZED
    assert response.json()["error"] == "ERROR_NO_PERMISSION_TO_TABLE"

    response = api_client.post(
        reverse("api:database:rows:list", kwargs={"table_id": table_2.id}),
        {f"field_{text_field.id}": "Green"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {jwt_token}",
    )
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response.json()["error"] == "ERROR_USER_NOT_IN_GROUP"

    url = reverse("api:database:rows:list", kwargs={"table_id": table.id})
    response = api_client.post(
        f"{url}?before=99999",
        {f"field_{text_field.id}": "Green"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {jwt_token}",
    )
    assert response.status_code == HTTP_404_NOT_FOUND
    assert response.json()["error"] == "ERROR_ROW_DOES_NOT_EXIST"

    response = api_client.post(
        reverse("api:database:rows:list", kwargs={"table_id": table.id}),
        {
            f"field_{text_field.id}": "Green",
            f"field_{number_field.id}": -10,
            f"field_{boolean_field.id}": None,
            f"field_{text_field_2.id}": None,
        },
        format="json",
        HTTP_AUTHORIZATION=f"JWT {jwt_token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json["error"] == "ERROR_REQUEST_BODY_VALIDATION"
    assert len(response_json["detail"]) == 2
    assert response_json["detail"][f"field_{number_field.id}"][0][
        "code"] == "min_value"
    assert response_json["detail"][f"field_{boolean_field.id}"][0][
        "code"] == "null"

    response = api_client.post(
        reverse("api:database:rows:list", kwargs={"table_id": table.id}),
        {},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {jwt_token}",
    )
    response_json_row_1 = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json_row_1[f"field_{text_field.id}"] == "white"
    assert not response_json_row_1[f"field_{number_field.id}"]
    assert response_json_row_1[f"field_{boolean_field.id}"] is False
    assert response_json_row_1[f"field_{text_field_2.id}"] is None
    assert response_json_row_1["order"] == "1.00000000000000000000"

    response = api_client.post(
        reverse("api:database:rows:list", kwargs={"table_id": table.id}),
        {
            f"field_{number_field.id}": None,
            f"field_{boolean_field.id}": False,
            f"field_{text_field_2.id}": "",
        },
        format="json",
        HTTP_AUTHORIZATION=f"JWT {jwt_token}",
    )
    response_json_row_2 = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json_row_2[f"field_{text_field.id}"] == "white"
    assert not response_json_row_2[f"field_{number_field.id}"]
    assert response_json_row_2[f"field_{boolean_field.id}"] is False
    assert response_json_row_2[f"field_{text_field_2.id}"] == ""
    assert response_json_row_2["order"] == "2.00000000000000000000"

    response = api_client.post(
        reverse("api:database:rows:list", kwargs={"table_id": table.id}),
        {
            f"field_{text_field.id}": "Green",
            f"field_{number_field.id}": 120,
            f"field_{boolean_field.id}": True,
            f"field_{text_field_2.id}": "Not important",
        },
        format="json",
        HTTP_AUTHORIZATION=f"JWT {jwt_token}",
    )
    response_json_row_3 = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json_row_3[f"field_{text_field.id}"] == "Green"
    assert response_json_row_3[f"field_{number_field.id}"] == "120"
    assert response_json_row_3[f"field_{boolean_field.id}"]
    assert response_json_row_3[f"field_{text_field_2.id}"] == "Not important"
    assert response_json_row_3["order"] == "3.00000000000000000000"

    response = api_client.post(
        reverse("api:database:rows:list", kwargs={"table_id": table.id}),
        {
            f"field_{text_field.id}": "Purple",
            f"field_{number_field.id}": 240,
            f"field_{boolean_field.id}": True,
            f"field_{text_field_2.id}": "",
        },
        format="json",
        HTTP_AUTHORIZATION=f"Token {token.key}",
    )
    response_json_row_4 = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json_row_4[f"field_{text_field.id}"] == "Purple"
    assert response_json_row_4[f"field_{number_field.id}"] == "240"
    assert response_json_row_4[f"field_{boolean_field.id}"]
    assert response_json_row_4[f"field_{text_field_2.id}"] == ""
    assert response_json_row_4["order"] == "4.00000000000000000000"

    token.refresh_from_db()
    assert token.handled_calls == 1

    url = reverse("api:database:rows:list", kwargs={"table_id": table.id})
    response = api_client.post(
        f"{url}?before={response_json_row_3['id']}",
        {
            f"field_{text_field.id}": "Red",
            f"field_{number_field.id}": 480,
            f"field_{boolean_field.id}": False,
            f"field_{text_field_2.id}": "",
        },
        format="json",
        HTTP_AUTHORIZATION=f"Token {token.key}",
    )
    response_json_row_5 = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json_row_5[f"field_{text_field.id}"] == "Red"
    assert response_json_row_5[f"field_{number_field.id}"] == "480"
    assert not response_json_row_5[f"field_{boolean_field.id}"]
    assert response_json_row_5[f"field_{text_field_2.id}"] == ""
    assert response_json_row_5["order"] == "2.99999999999999999999"

    token.refresh_from_db()
    assert token.handled_calls == 2

    model = table.get_model()
    assert model.objects.all().count() == 5
    rows = model.objects.all()

    row_1 = rows[0]
    assert row_1.id == response_json_row_1["id"]
    assert getattr(row_1, f"field_{text_field.id}") == "white"
    assert getattr(row_1, f"field_{number_field.id}") is None
    assert getattr(row_1, f"field_{boolean_field.id}") is False
    assert getattr(row_1, f"field_{text_field_2.id}") is None

    row_2 = rows[1]
    assert row_2.id == response_json_row_2["id"]
    assert getattr(row_2, f"field_{text_field.id}") == "white"
    assert getattr(row_2, f"field_{number_field.id}") is None
    assert getattr(row_2, f"field_{boolean_field.id}") is False
    assert getattr(row_2, f"field_{text_field_2.id}") == ""

    row_5 = rows[2]
    assert row_5.id == response_json_row_5["id"]
    assert getattr(row_5, f"field_{text_field.id}") == "Red"
    assert getattr(row_5, f"field_{number_field.id}") == 480
    assert getattr(row_5, f"field_{boolean_field.id}") is False
    assert getattr(row_5, f"field_{text_field_2.id}") == ""

    row_3 = rows[3]
    assert row_3.id == response_json_row_3["id"]
    assert getattr(row_3, f"field_{text_field.id}") == "Green"
    assert getattr(row_3, f"field_{number_field.id}") == 120
    assert getattr(row_3, f"field_{boolean_field.id}") is True
    assert getattr(row_3, f"field_{text_field_2.id}") == "Not important"

    row_4 = rows[4]
    assert row_4.id == response_json_row_4["id"]
    assert getattr(row_4, f"field_{text_field.id}") == "Purple"
    assert getattr(row_4, f"field_{number_field.id}") == 240
    assert getattr(row_4, f"field_{boolean_field.id}") is True
    assert getattr(row_4, f"field_{text_field_2.id}") == ""
Example #2
0
def test_create_row(api_client, data_fixture):
    user, jwt_token = data_fixture.create_user_and_token()
    table = data_fixture.create_database_table(user=user)
    table_2 = data_fixture.create_database_table()
    text_field = data_fixture.create_text_field(table=table,
                                                order=0,
                                                name='Color',
                                                text_default='white')
    number_field = data_fixture.create_number_field(table=table,
                                                    order=1,
                                                    name='Horsepower')
    boolean_field = data_fixture.create_boolean_field(table=table,
                                                      order=2,
                                                      name='For sale')
    text_field_2 = data_fixture.create_text_field(table=table,
                                                  order=3,
                                                  name='Description')

    token = TokenHandler().create_token(user, table.database.group, 'Good')
    wrong_token = TokenHandler().create_token(user, table.database.group,
                                              'Wrong')
    TokenHandler().update_token_permissions(user, wrong_token, False, True,
                                            True, True)

    response = api_client.post(reverse('api:database:rows:list',
                                       kwargs={'table_id': 99999}),
                               {f'field_{text_field.id}': 'Test 1'},
                               format='json',
                               HTTP_AUTHORIZATION=f'JWT {jwt_token}')
    assert response.status_code == HTTP_404_NOT_FOUND
    assert response.json()['error'] == 'ERROR_TABLE_DOES_NOT_EXIST'

    response = api_client.post(reverse('api:database:rows:list',
                                       kwargs={'table_id': table.id}),
                               {f'field_{text_field.id}': 'Test 1'},
                               format='json',
                               HTTP_AUTHORIZATION='Token abc123')
    assert response.status_code == HTTP_401_UNAUTHORIZED
    assert response.json()['error'] == 'ERROR_TOKEN_DOES_NOT_EXIST'

    response = api_client.post(reverse('api:database:rows:list',
                                       kwargs={'table_id': table.id}),
                               {f'field_{text_field.id}': 'Test 1'},
                               format='json',
                               HTTP_AUTHORIZATION=f'Token {wrong_token.key}')
    assert response.status_code == HTTP_401_UNAUTHORIZED
    assert response.json()['error'] == 'ERROR_NO_PERMISSION_TO_TABLE'

    response = api_client.post(reverse('api:database:rows:list',
                                       kwargs={'table_id': table_2.id}),
                               {f'field_{text_field.id}': 'Green'},
                               format='json',
                               HTTP_AUTHORIZATION=f'JWT {jwt_token}')
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response.json()['error'] == 'ERROR_USER_NOT_IN_GROUP'

    url = reverse('api:database:rows:list', kwargs={'table_id': table.id})
    response = api_client.post(f'{url}?before=99999',
                               {f'field_{text_field.id}': 'Green'},
                               format='json',
                               HTTP_AUTHORIZATION=f'JWT {jwt_token}')
    assert response.status_code == HTTP_404_NOT_FOUND
    assert response.json()['error'] == 'ERROR_ROW_DOES_NOT_EXIST'

    response = api_client.post(reverse('api:database:rows:list',
                                       kwargs={'table_id': table.id}), {
                                           f'field_{text_field.id}': 'Green',
                                           f'field_{number_field.id}': -10,
                                           f'field_{boolean_field.id}': None,
                                           f'field_{text_field_2.id}': None
                                       },
                               format='json',
                               HTTP_AUTHORIZATION=f'JWT {jwt_token}')
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json['error'] == 'ERROR_REQUEST_BODY_VALIDATION'
    assert len(response_json['detail']) == 2
    assert response_json['detail'][f'field_{number_field.id}'][0][
        'code'] == 'min_value'
    assert response_json['detail'][f'field_{boolean_field.id}'][0][
        'code'] == 'null'

    response = api_client.post(reverse('api:database:rows:list',
                                       kwargs={'table_id': table.id}), {},
                               format='json',
                               HTTP_AUTHORIZATION=f'JWT {jwt_token}')
    response_json_row_1 = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json_row_1[f'field_{text_field.id}'] == 'white'
    assert not response_json_row_1[f'field_{number_field.id}']
    assert response_json_row_1[f'field_{boolean_field.id}'] is False
    assert response_json_row_1[f'field_{text_field_2.id}'] is None
    assert response_json_row_1['order'] == '1.00000000000000000000'

    response = api_client.post(reverse('api:database:rows:list',
                                       kwargs={'table_id': table.id}), {
                                           f'field_{number_field.id}': None,
                                           f'field_{boolean_field.id}': False,
                                           f'field_{text_field_2.id}': '',
                                       },
                               format='json',
                               HTTP_AUTHORIZATION=f'JWT {jwt_token}')
    response_json_row_2 = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json_row_2[f'field_{text_field.id}'] == 'white'
    assert not response_json_row_2[f'field_{number_field.id}']
    assert response_json_row_2[f'field_{boolean_field.id}'] is False
    assert response_json_row_2[f'field_{text_field_2.id}'] == ''
    assert response_json_row_2['order'] == '2.00000000000000000000'

    response = api_client.post(reverse('api:database:rows:list',
                                       kwargs={'table_id': table.id}),
                               {
                                   f'field_{text_field.id}': 'Green',
                                   f'field_{number_field.id}': 120,
                                   f'field_{boolean_field.id}': True,
                                   f'field_{text_field_2.id}': 'Not important',
                               },
                               format='json',
                               HTTP_AUTHORIZATION=f'JWT {jwt_token}')
    response_json_row_3 = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json_row_3[f'field_{text_field.id}'] == 'Green'
    assert response_json_row_3[f'field_{number_field.id}'] == '120'
    assert response_json_row_3[f'field_{boolean_field.id}']
    assert response_json_row_3[f'field_{text_field_2.id}'] == 'Not important'
    assert response_json_row_3['order'] == '3.00000000000000000000'

    response = api_client.post(reverse('api:database:rows:list',
                                       kwargs={'table_id': table.id}), {
                                           f'field_{text_field.id}': 'Purple',
                                           f'field_{number_field.id}': 240,
                                           f'field_{boolean_field.id}': True,
                                           f'field_{text_field_2.id}': ''
                                       },
                               format='json',
                               HTTP_AUTHORIZATION=f'Token {token.key}')
    response_json_row_4 = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json_row_4[f'field_{text_field.id}'] == 'Purple'
    assert response_json_row_4[f'field_{number_field.id}'] == '240'
    assert response_json_row_4[f'field_{boolean_field.id}']
    assert response_json_row_4[f'field_{text_field_2.id}'] == ''
    assert response_json_row_4['order'] == '4.00000000000000000000'

    token.refresh_from_db()
    assert token.handled_calls == 1

    url = reverse('api:database:rows:list', kwargs={'table_id': table.id})
    response = api_client.post(f"{url}?before={response_json_row_3['id']}", {
        f'field_{text_field.id}': 'Red',
        f'field_{number_field.id}': 480,
        f'field_{boolean_field.id}': False,
        f'field_{text_field_2.id}': ''
    },
                               format='json',
                               HTTP_AUTHORIZATION=f'Token {token.key}')
    response_json_row_5 = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json_row_5[f'field_{text_field.id}'] == 'Red'
    assert response_json_row_5[f'field_{number_field.id}'] == '480'
    assert not response_json_row_5[f'field_{boolean_field.id}']
    assert response_json_row_5[f'field_{text_field_2.id}'] == ''
    assert response_json_row_5['order'] == '2.99999999999999999999'

    token.refresh_from_db()
    assert token.handled_calls == 2

    model = table.get_model()
    assert model.objects.all().count() == 5
    rows = model.objects.all()

    row_1 = rows[0]
    assert row_1.id == response_json_row_1['id']
    assert getattr(row_1, f'field_{text_field.id}') == 'white'
    assert getattr(row_1, f'field_{number_field.id}') is None
    assert getattr(row_1, f'field_{boolean_field.id}') is False
    assert getattr(row_1, f'field_{text_field_2.id}') is None

    row_2 = rows[1]
    assert row_2.id == response_json_row_2['id']
    assert getattr(row_2, f'field_{text_field.id}') == 'white'
    assert getattr(row_2, f'field_{number_field.id}') is None
    assert getattr(row_2, f'field_{boolean_field.id}') is False
    assert getattr(row_2, f'field_{text_field_2.id}') == ''

    row_5 = rows[2]
    assert row_5.id == response_json_row_5['id']
    assert getattr(row_5, f'field_{text_field.id}') == 'Red'
    assert getattr(row_5, f'field_{number_field.id}') == 480
    assert getattr(row_5, f'field_{boolean_field.id}') is False
    assert getattr(row_5, f'field_{text_field_2.id}') == ''

    row_3 = rows[3]
    assert row_3.id == response_json_row_3['id']
    assert getattr(row_3, f'field_{text_field.id}') == 'Green'
    assert getattr(row_3, f'field_{number_field.id}') == 120
    assert getattr(row_3, f'field_{boolean_field.id}') is True
    assert getattr(row_3, f'field_{text_field_2.id}') == 'Not important'

    row_4 = rows[4]
    assert row_4.id == response_json_row_4['id']
    assert getattr(row_4, f'field_{text_field.id}') == 'Purple'
    assert getattr(row_4, f'field_{number_field.id}') == 240
    assert getattr(row_4, f'field_{boolean_field.id}') is True
    assert getattr(row_4, f'field_{text_field_2.id}') == ''