def test_it_returns_conflict_error_if_new_technology_name_exist(client):
    python_data = {
        'name': 'Python',
        'description': 'Object oriented programming language',
    }
    elixir_data = {
        'name': 'Elixir',
        'description': 'Functional programming language',
    }
    create_resp = client.post(
        '/technologies',
        json=python_data,
        headers=auth_header_with_all_permissions
    )
    create_resp_data = create_resp.get_json()
    client.post(
        '/technologies',
        json=elixir_data,
        headers=auth_header_with_all_permissions
    )
    edited_data = {
        'name': 'Elixir',
    }
    edited_resp = client.patch(
        create_resp_data['href'],
        json=edited_data,
        headers=auth_header_with_all_permissions
    )
    edited_resp_data = edited_resp.get_json()
    assert '409' in edited_resp.status
    assert edited_resp_data['error'] == 409
    assert 'Entity already exists' in edited_resp_data['message']
def test_it_indexes_authors(client):
    first_author = {
        'name': 'Paweł',
        'surname': 'Niesiołowski',
        'email': '*****@*****.**',
    }
    second_author = {
        'name': 'Gal',
        'surname': 'Anonim',
        'email': '*****@*****.**',
    }
    client.post(
        '/authors',
        json=first_author,
        headers=auth_header_with_all_permissions
    )
    client.post(
        '/authors',
        json=second_author,
        headers=auth_header_with_all_permissions
    )
    resp = client.get('/authors')
    resp_data = resp.get_json()['data']
    assert '200' in resp.status
    assert len(resp_data) == 2
def test_it_creates_author_with_technology(client):
    technology_data = {
        'name': 'Python',
        'description': 'Programming language',
    }
    resp = client.post(
        '/technologies',
        json=technology_data,
        headers=auth_header_with_all_permissions
    ).get_json()
    technology = client.get(resp['href']).get_json()['data']
    data = {
        'name': 'Paweł',
        'surname': 'Niesiołowski',
        'email': '*****@*****.**',
        'description': 'Pasionate programmer.',
        'technologies': [technology['id']],
    }
    resp = client.post(
        '/authors',
        json=data,
        headers=auth_header_with_all_permissions
    )
    authors = Author.query.filter(Author.surname == 'Niesiołowski').all()
    assert '201' in resp.status
    assert len(authors) == 1
    assert authors[0].technologies[0].name == 'Python'
def test_id_delete_technology(client):
    python_data = {
        'name': 'Python',
        'description': 'Object oriented programming language',
    }
    elixir_data = {
        'name': 'Elixir',
        'description': 'Functional programming language',
    }
    client.post(
        '/technologies',
        json=python_data,
        headers=auth_header_with_all_permissions
    )
    create_resp = client.post(
        '/technologies',
        json=elixir_data,
        headers=auth_header_with_all_permissions
    )
    create_resp_data = create_resp.get_json()
    resp = client.delete(
        create_resp_data['href'],
        headers=auth_header_with_all_permissions
    )
    assert '204' in resp.status
    assert len(Technology.query.all()) == 1
def test_it_indexes_reviewers(client):
    technology_id = create_technology_and_return_id(client, 'Python')
    first_reviewer = {
        'name': 'Paweł',
        'surname': 'Niesiołowski',
        'email': '*****@*****.**',
        'technologies': [technology_id],
    }
    second_reviewer = {
        'name': 'Gal',
        'surname': 'Anonim',
        'email': '*****@*****.**',
        'technologies': [technology_id],
    }
    client.post(
        '/reviewers',
        json=first_reviewer,
        headers=auth_header_with_all_permissions
    )
    client.post(
        '/reviewers',
        json=second_reviewer,
        headers=auth_header_with_all_permissions
    )
    resp = client.get('/reviewers')
    resp_data = resp.get_json()['data']
    assert '200' in resp.status
    assert len(resp_data) == 2
def test_it_gets_author(client):
    technology_data = {
        'name': 'Python',
        'description': 'Programming language.',
    }
    create_technology_resp_data = client.post(
        '/technologies',
        json=technology_data,
        headers=auth_header_with_all_permissions
    ).get_json()
    technology = client.get(
        create_technology_resp_data['href']
    ).get_json()['data']
    data = {
        'name': 'Paweł',
        'surname': 'Niesiołowski',
        'email': '*****@*****.**',
        'description': 'Pasionate programmer.',
        'technologies': [technology['id']],
    }
    create_author_resp_data = client.post(
        '/authors',
        json=data,
        headers=auth_header_with_all_permissions
    ).get_json()
    resp = client.get(create_author_resp_data['href'])
    author = resp.get_json()['data']
    assert '200' in resp.status
    assert author['name'] == 'Paweł'
    assert author['surname'] == 'Niesiołowski'
    assert author['email'] == '*****@*****.**'
    assert author['description'] == 'Pasionate programmer.'
    assert len(author['technologies']) == 1
    assert author['technologies'][0]['name'] == 'Python'
    assert author['technologies'][0]['description'] == 'Programming language.'
def test_it_edits_reviewer(client):
    python_id = create_technology_and_return_id(client, 'Python')
    elixir_id = create_technology_and_return_id(client, 'Elixir')
    new_reviewer_data = {
        'name': 'Paweł',
        'surname': 'Niesiołowski',
        'email': '*****@*****.**',
        'description': 'Experienced programmer.',
        'technologies': [python_id],
    }
    reviewer_href = client.post(
        '/reviewers',
        json=new_reviewer_data,
        headers=auth_header_with_all_permissions
    ).get_json()['href']

    edited_reviewer_data = {
        'description': 'Very experienced programmer.',
        'technologies': [python_id, elixir_id],
    }

    resp = client.patch(
        reviewer_href,
        json=edited_reviewer_data,
        headers=auth_header_with_all_permissions
    )
    reviewers = Reviewer.query.filter(
        Reviewer.description == 'Very experienced programmer.'
    ).all()

    assert '204' in resp.status
    assert len(reviewers) == 1
    assert len(reviewers[0].technologies) == 2
def test_it_edits_given_authors_data(client):
    data = {
        'name': 'Paweł',
        'surname': 'Niesiołowski',
        'email': '*****@*****.**',
    }
    author_href = client.post(
        '/authors',
        json=data,
        headers=auth_header_with_all_permissions
    ).get_json()['href']
    edited_data = {
        'email': '*****@*****.**',
    }
    resp = client.patch(
        author_href,
        json=edited_data,
        headers=auth_header_with_all_permissions
    )
    authors = Author.query.filter(Author.email == '*****@*****.**').all()
    assert '204' in resp.status
    assert len(authors) == 1
    author = authors[0]
    assert author.name == 'Paweł'
    assert author.surname == 'Niesiołowski'
def test_it_changes_technologies_for_author(client):
    python_data = {
        'name': 'Python',
        'description': 'Programming language',
    }
    elixir_data = {
        'name': 'Elixir',
        'description': 'Programming language',
    }
    python_resp = client.post(
        '/technologies',
        json=python_data,
        headers=auth_header_with_all_permissions
    ).get_json()
    elixir_resp = client.post(
        '/technologies',
        json=elixir_data,
        headers=auth_header_with_all_permissions
    ).get_json()
    python_technology = client.get(python_resp['href']).get_json()['data']
    elixir_technology = client.get(elixir_resp['href']).get_json()['data']
    data = {
        'name': 'Paweł',
        'surname': 'Niesiołowski',
        'email': '*****@*****.**',
        'technologies': [python_technology['id']],
    }
    author_href = client.post(
        '/authors',
        json=data,
        headers=auth_header_with_all_permissions
    ).get_json()['href']

    edited_data = {
        'technologies': [elixir_technology['id']],
    }
    resp = client.patch(
        author_href,
        json=edited_data,
        headers=auth_header_with_all_permissions
    )
    authors = Author.query.filter(Author.surname == 'Niesiołowski').all()
    assert '204' in resp.status
    assert len(authors) == 1
    assert len(authors[0].technologies) == 1
    assert authors[0].technologies[0].name == 'Elixir'
def test_index_technologies(client):
    python_data = {
        'name': 'Python',
        'description': 'Object oriented programming language',
    }
    elixir_data = {
        'name': 'Elixir',
        'description': 'Functional programming language',
    }
    client.post(
        '/technologies',
        json=python_data,
        headers=auth_header_with_all_permissions
    )
    client.post(
        '/technologies',
        json=elixir_data,
        headers=auth_header_with_all_permissions
    )
    resp = client.get('/technologies')
    resp_data = resp.get_json()
    assert '200' in resp.status
    assert len(resp_data['data']) == 2
def test_it_returns_validation_error_when_technology_data_is_invalid(client):
    data = {
        'name': '',
        'description': 'Description for empty name'
    }
    resp = client.post(
        '/technologies',
        json=data,
        headers=auth_header_with_all_permissions
    )
    resp_data = resp.get_json()
    assert '422' in resp.status
    assert 422 == resp_data['error']
    assert 'Validation error' in resp_data['message']
def test_it_returns_conflict_error_when_technology_name_already_exists(client):
    data = {
        'name': 'Python',
        'description': '''An interpreted, high-level,
general-purpose programming language''',
    }
    data_with_already_added_name = {
        'name': 'Python',
        'description': 'Programming language',
    }
    client.post(
        '/technologies',
        json=data,
        headers=auth_header_with_all_permissions
    )
    resp = client.post(
        '/technologies',
        json=data_with_already_added_name,
        headers=auth_header_with_all_permissions
    )
    resp_data = resp.get_json()
    assert '409' in resp.status
    assert 409 == resp_data['error']
    assert 'Entity already exists' in resp_data['message']
def test_it_creates_author_without_technologies_and_projects(client):
    data = {
        'name': 'Paweł',
        'surname': 'Niesiołowski',
        'email': '*****@*****.**',
        'description': 'Pasionate programmer.',
    }
    resp = client.post(
        '/authors',
        json=data,
        headers=auth_header_with_all_permissions
    )
    resp_data = resp.get_json()
    authors = Author.query.filter(Author.surname == 'Niesiołowski').all()
    assert '201' in resp.status
    assert len(authors) == 1
    assert resp_data['href'] == f'/authors/{authors[0].id}'
def test_it_creates_technology(client):
    data = {
        'name': 'Python',
        'description': '''An interpreted, high-level,
general-purpose programming language''',
    }
    resp = client.post(
        '/technologies',
        json=data,
        headers=auth_header_with_all_permissions
    )
    resp_data = resp.get_json()
    assert '201' in resp.status

    technologies = Technology.query.filter(Technology.name == 'Python').all()
    assert len(technologies) == 1
    assert resp_data['href'] == f'/technologies/{technologies[0].id}'
def test_it_returns_404_if_author_data_is_invalid(client):
    data = {
        'name': 'Paweł',
        'surname': '',
        'email': '*****@*****.**',
        'description': 'Pasionate programmer.',
    }
    resp = client.post(
        '/authors',
        json=data,
        headers=auth_header_with_all_permissions
    )
    resp_data = resp.get_json()
    authors = Author.query.filter(Author.surname == 'Niesiołowski').all()
    assert '422' in resp.status
    assert len(authors) == 0
    assert resp_data['error'] == 422
    assert 'Validation error' in resp_data['message']
def test_it_gets_technology(client):
    description = '''An interpreted, high-level,
general-purpose programming language'''
    data = {
        'name': 'Python',
        'description': description
    }
    post_resp = client.post(
        '/technologies',
        json=data,
        headers=auth_header_with_all_permissions
    )
    post_resp_data = post_resp.get_json()
    get_resp = client.get(post_resp_data['href'])
    get_resp_data = get_resp.get_json()
    assert '200' in get_resp.status
    assert get_resp_data['data']['name'] == 'Python'
    assert get_resp_data['data']['description'] == description
def test_it_creates_reviewer(client):
    technology_id = create_technology_and_return_id(client, 'Python')
    reviewer_data = {
        'name': 'Paweł',
        'surname': 'Niesiołowski',
        'email': '*****@*****.**',
        'technologies': [technology_id],
    }
    resp = client.post(
        '/reviewers',
        json=reviewer_data,
        headers=auth_header_with_all_permissions
    )
    reviewer_href = resp.get_json()['href']
    reviewers = Reviewer.query.filter(Reviewer.surname == 'Niesiołowski').all()

    assert '201' in resp.status
    assert len(reviewers) == 1
    assert reviewer_href == f'/reviewers/{reviewers[0].id}'
def test_it_returns_404_if_technology_name_is_empty_string(client):
    data = {
        'name': 'Python',
        'description': 'Object oriented programming language',
    }
    href = client.post(
        '/technologies',
        json=data,
        headers=auth_header_with_all_permissions
    ).get_json()['href']
    resp = client.patch(
        href,
        json={'name': ''},
        headers=auth_header_with_all_permissions
    )
    resp_data = resp.get_json()
    assert '422' in resp.status
    assert resp_data['error'] == 422
    assert 'Validation error' in resp_data['message']
def test_it_returns_422_if_reviewer_does_not_have_any_technology(client):
    technology_id = create_technology_and_return_id(client, 'Python')
    reviewer_data = {
        'name': 'Paweł',
        'surname': 'Niesiołowski',
        'email': '*****@*****.**',
        'technologies': '',
    }
    resp = client.post(
        '/reviewers',
        json=reviewer_data,
        headers=auth_header_with_all_permissions
    )
    resp_data = resp.get_json()
    reviewers = Reviewer.query.filter(Reviewer.surname == 'Niesiołowski').all()

    assert '422' in resp.status
    assert len(reviewers) == 0
    assert resp_data['error'] == 422
    assert 'Validation error' in resp_data['message']
def test_it_deletes_author(client):
    technology_id = create_technology_and_return_id(client, 'Python')
    data = {
        'name': 'Paweł',
        'surname': 'Niesiołowski',
        'email': '*****@*****.**',
        'technologies': [technology_id],
    }
    created_author_data = client.post(
        '/authors',
        json=data,
        headers=auth_header_with_all_permissions
    ).get_json()
    authors_before_delete = Author.query.all()
    resp = client.delete(
        created_author_data['href'],
        headers=auth_header_with_all_permissions
    )
    authors_after_delete = Author.query.all()
    assert '204' in resp.status
    assert len(authors_before_delete) == 1
    assert len(authors_after_delete) == 0
def test_it_gets_reviewer(client):
    technology_id = create_technology_and_return_id(client, 'Python')
    reviewer_data = {
        'name': 'Paweł',
        'surname': 'Niesiołowski',
        'email': '*****@*****.**',
        'technologies': [technology_id],
    }
    reviewer_href = client.post(
        '/reviewers',
        json=reviewer_data,
        headers=auth_header_with_all_permissions
    ).get_json()['href']

    resp = client.get(reviewer_href)
    resp_data = resp.get_json()['data']

    assert '200' in resp.status
    assert resp_data['name'] == 'Paweł'
    assert resp_data['surname'] == 'Niesiołowski'
    assert resp_data['email'] == '*****@*****.**'
    assert len(resp_data['technologies']) == 1
    assert resp_data['technologies'][0]['name'] == 'Python'
def test_it_edits_technology(client):
    data = {
        'name': 'Python 3',
        'description': 'Programming language',
    }
    create_resp = client.post(
        '/technologies',
        json=data,
        headers=auth_header_with_all_permissions
    )
    create_resp_data = create_resp.get_json()
    get_resp = client.get(create_resp_data['href'])
    get_resp_data = get_resp.get_json()
    edited_data = {
        'name': 'Python',
    }
    edit_resp = client.patch(
        create_resp_data['href'],
        json=edited_data,
        headers=auth_header_with_all_permissions
    )
    assert '204' in edit_resp.status
    technologies = Technology.query.filter(Technology.name == 'Python').all()
    assert len(technologies) == 1