Example #1
0
async def test_filter_contractors_skills(cli, db_conn, company, filter_args,
                                         con_count):
    await db_conn.execute(sa_contractors.insert().values([
        dict(id=1,
             company=company.id,
             first_name='Fred',
             last_name='Bloggs',
             last_updated=datetime.now()),
        dict(id=2,
             company=company.id,
             first_name='con2',
             last_name='tractor',
             last_updated=datetime.now()),
    ]))
    await create_con_skills(db_conn, 1)

    url = str(cli.server.app.router['contractor-list'].url_for(
        company=company.public_key))
    r = await cli.get(url + '?' + filter_args)
    assert r.status == 200, await r.text()
    obj = await r.json()
    assert obj['count'] == con_count, obj
    assert len(obj['results']) == con_count, obj
    if con_count == 1:
        assert obj['results'][0]['link'] == '1-fred-b'
Example #2
0
async def test_qual_level_list(cli, db_conn, company):
    await db_conn.execute(sa_contractors.insert().values([
        dict(id=1,
             company=company.id,
             first_name='Fred',
             last_name='Bloggs',
             last_updated=datetime.now()),
        dict(id=2,
             company=company.id,
             first_name='con2',
             last_name='tractor',
             last_updated=datetime.now()),
    ]))
    # adding qual levels to both cons checks distinct in query
    await create_con_skills(db_conn, 1, 2)

    await db_conn.execute(sa_qual_levels.insert().values({
        'id': 4,
        'name': 'ql4',
        'ranking': 0
    }))

    r = await cli.get(cli.server.app.router['qual-level-list'].url_for(
        company=company.public_key))
    assert r.status == 200, await r.text()
    obj = await r.json()
    assert obj == [{
        'id': 11,
        'name': 'GCSE',
        'link': '11-gcse'
    }, {
        'id': 12,
        'name': 'A Level',
        'link': '12-a-level'
    }]
Example #3
0
async def test_distance_filter(cli, db_conn, company, params, con_distances):
    await db_conn.execute(sa_contractors.insert().values([
        dict(
            id=1,
            company=company.id,
            latitude=51.5,
            longitude=-0.1,
            first_name='b_con1',
            last_name='t',
            last_updated=datetime.now(),
        ),
        dict(
            id=2,
            company=company.id,
            latitude=51.5,
            longitude=0,
            first_name='a_con2',
            last_name='t',
            last_updated=datetime.now(),
        ),
    ]))

    url = str(cli.server.app.router['contractor-list'].url_for(
        company=company.public_key))
    r = await cli.get(url,
                      params=params,
                      headers={
                          'X-Forwarded-For': '1.1.1.1',
                          'CF-IPCountry': 'GB'
                      })
    assert r.status == 200, await r.text()
    obj = await r.json()
    assert list(map(itemgetter('link', 'distance'),
                    obj['results'])) == con_distances
async def test_list_contractors_name(cli, db_conn, company):
    await db_conn.execute(sa_contractors.insert().values(
        id=1,
        company=company.id,
        first_name='Fred',
        last_name='Bloggs',
        last_updated=datetime.now()))
    r = await cli.get(cli.server.app.router['contractor-list'].url_for(
        company='thepublickey'))
    assert r.status == 200, await r.text()
    assert (await r.json())['results'][0]['link'] == '1-fred-b'
    assert (await r.json())['results'][0]['name'] == 'Fred B'

    await db_conn.execute((update(sa_companies).values({
        'name_display':
        NameOptions.first_name
    }).where(sa_companies.c.public_key == company.public_key)))
    r = await cli.get(cli.server.app.router['contractor-list'].url_for(
        company='thepublickey'))
    assert r.status == 200, await r.text()
    assert (await r.json())['results'][0]['link'] == '1-fred'
    assert (await r.json())['results'][0]['name'] == 'Fred'

    await db_conn.execute((update(sa_companies).values({
        'name_display':
        NameOptions.full_name
    }).where(sa_companies.c.public_key == company.public_key)))
    r = await cli.get(cli.server.app.router['contractor-list'].url_for(
        company='thepublickey'))
    assert r.status == 200, await r.text()
    assert (await r.json())['results'][0]['link'] == '1-fred-bloggs'
    assert (await r.json())['results'][0]['name'] == 'Fred Bloggs'
async def test_list_contractors(cli, db_conn, settings):
    v = await db_conn.execute(sa_companies.insert().values(
        name='testing', public_key='thepublickey',
        private_key='theprivatekey').returning(sa_companies.c.id))
    r = await v.first()
    company_id = r.id
    await db_conn.execute(sa_contractors.insert().values(
        id=1,
        company=company_id,
        first_name='Fred',
        last_name='Bloggs',
        last_updated=datetime.now(),
        photo_hash='abc',
    ))
    headers = {
        'HOST': 'www.example.com',
    }
    r = await cli.get(cli.server.app.router['contractor-list'].url_for(
        company='thepublickey'),
                      headers=headers)
    assert r.status == 200, await r.text()
    assert r.headers.get('Access-Control-Allow-Origin') == '*'
    obj = await r.json()
    assert [{
        'id': 1,
        'link': '1-fred-b',
        'name': 'Fred B',
        'photo': f'{settings.images_url}/thepublickey/1.thumb.jpg?h=abc',
        'tag_line': None,
        'primary_description': None,
        'town': None,
        'country': None,
        'distance': None,
        'url': '/thepublickey/contractors/1',
    }] == obj['results']
async def test_review_display(cli, db_conn, company):
    await db_conn.execute(sa_contractors.insert().values(
        dict(
            id=1,
            company=company.id,
            first_name='Anne',
            last_name='x',
            last_updated=datetime.now(),
            review_rating=4.249,
            review_duration=7200,
        )))
    url = cli.server.app.router['contractor-get'].url_for(
        company='thepublickey', id='1', slug='x')
    r = await cli.get(url)
    assert r.status == 200
    obj = await r.json()
    assert (obj['review_rating'], obj['review_duration']) == (None, None)

    await db_conn.execute(
        update(sa_companies).values(options={'show_stars': True}))

    r = await cli.get(url)
    obj = await r.json()
    assert (obj['review_rating'], obj['review_duration']) == (4.249, None)

    await db_conn.execute(
        update(sa_companies).values(options={
            'show_stars': True,
            'show_hours_reviewed': True
        }))

    r = await cli.get(url)
    obj = await r.json()
    assert (obj['review_rating'], obj['review_duration']) == (4.249, 7200)
async def test_view_labels(cli, db_conn, company):
    await db_conn.execute(sa_contractors.insert().values(
        dict(id=1,
             company=company.id,
             first_name='Anne',
             last_name='x',
             last_updated=datetime.now())))
    url = cli.server.app.router['contractor-get'].url_for(
        company='thepublickey', id='1', slug='x')
    r = await cli.get(url)
    assert r.status == 200
    assert (await r.json())['labels'] == []

    await db_conn.execute(
        update(sa_contractors).values(
            labels=['apple', 'banana', 'carrot']).where(
                sa_contractors.c.id == 1))

    r = await cli.get(url)
    assert r.status == 200
    assert (await r.json())['labels'] == []

    await db_conn.execute(
        update(sa_companies).values(options={'show_labels': True}))

    r = await cli.get(url)
    assert r.status == 200
    assert (await r.json())['labels'] == ['apple', 'banana', 'carrot']
async def test_json_encoding(cli, db_conn, company, headers, newline_count):
    await db_conn.execute(sa_contractors.insert().values(
        id=1,
        company=company.id,
        first_name='Fred',
        last_name='Bloggs',
        last_updated=datetime.now()))
    r = await cli.get(cli.server.app.router['contractor-list'].url_for(
        company='thepublickey'),
                      headers=headers)
    assert r.status == 200
    assert (await r.text()).count('\n') == newline_count
Example #9
0
async def test_filter_contractors_skills_invalid(cli, db_conn, company):
    await db_conn.execute(sa_contractors.insert().values(
        id=1,
        company=company.id,
        first_name='Fred',
        last_name='Bloggs',
        last_updated=datetime.now()))

    url = str(cli.server.app.router['contractor-list'].url_for(
        company=company.public_key)) + '?subject=foobar'
    r = await cli.get(url)
    assert r.status == 400, await r.text()
    obj = await r.json()
    assert obj == {
        'details': '"subject" had an invalid value "foobar"',
        'status': 'invalid_argument'
    }
Example #10
0
async def test_label_filter(cli, db_conn, company, filter_args, cons):
    await db_conn.execute(sa_contractors.insert().values([
        dict(id=1,
             company=company.id,
             first_name='Anne',
             last_name='x',
             last_updated=datetime.now()),
        dict(id=2,
             company=company.id,
             first_name='Ben',
             last_name='x',
             last_updated=datetime.now()),
        dict(id=3,
             company=company.id,
             first_name='Charlie',
             last_name='x',
             last_updated=datetime.now()),
        dict(id=4,
             company=company.id,
             first_name='Dave',
             last_name='x',
             last_updated=datetime.now()),
    ]))
    await create_labels(db_conn, company)

    await db_conn.execute(
        update(sa_contractors).values(
            labels=['apple', 'banana', 'carrot']).where(
                sa_contractors.c.id == 1))
    await db_conn.execute(
        update(sa_contractors).values(labels=['apple']).where(
            sa_contractors.c.id == 2))
    await db_conn.execute(
        update(sa_contractors).values(labels=['banana', 'carrot']).where(
            sa_contractors.c.id == 3))

    url = str(cli.server.app.router['contractor-list'].url_for(
        company=company.public_key))
    r = await cli.get(url + '?sort=name&' + filter_args)
    assert r.status == 200, await r.text()
    obj = await r.json()
    assert [c['link'] for c in obj['results']] == cons
Example #11
0
async def test_contractor_pagination(cli, db_conn, company, filter_args,
                                     con_count, first_id, last_id):
    cons = [
        dict(id=i,
             company=company.id,
             first_name=f'Fred{i:04d}',
             last_name='X',
             last_updated=datetime.now()) for i in range(1, 111)
    ]
    await db_conn.execute(sa_contractors.insert().values(cons))

    url = str(cli.server.app.router['contractor-list'].url_for(
        company=company.public_key))
    r = await cli.get(url + '?' + filter_args)
    assert r.status == 200, await r.text()
    obj = await r.json()
    assert obj['count'] == 110
    results = obj['results']
    assert len(results) == con_count, obj
    assert results[0]['id'] == first_id, results[0]
    assert results[-1]['id'] == last_id, results[-1]
Example #12
0
async def test_filter_contractors_skills_distinct(cli, db_conn, company):
    await db_conn.execute(sa_contractors.insert().values(
        id=1,
        company=company.id,
        first_name='Fred',
        last_name='Bloggs',
        last_updated=datetime.now()))
    await create_con_skills(db_conn, 1)
    await db_conn.execute(sa_con_skills.insert().values({
        'contractor': 1,
        'subject': 1,
        'qual_level': 12
    }))

    url = str(cli.server.app.router['contractor-list'].url_for(
        company=company.public_key))
    r = await cli.get(url + '?subject=1')
    assert r.status == 200, await r.text()
    obj = await r.json()
    assert obj['count'] == 1, obj
    assert len(obj['results']) == 1, obj
Example #13
0
async def test_subject_list(cli, db_conn, company):
    await db_conn.execute(sa_contractors.insert().values([
        dict(id=1,
             company=company.id,
             first_name='Fred',
             last_name='Bloggs',
             last_updated=datetime.now()),
        dict(id=2,
             company=company.id,
             first_name='con2',
             last_name='tractor',
             last_updated=datetime.now()),
    ]))
    # adding subjects to both cons checks distinct in query
    await create_con_skills(db_conn, 1, 2)

    await db_conn.execute(sa_subjects.insert().values({
        'id': 4,
        'name': 's4',
        'category': 'sc4'
    }))

    r = await cli.get(cli.server.app.router['subject-list'].url_for(
        company=company.public_key))
    assert r.status == 200, await r.text()
    obj = await r.json()
    assert obj == [
        {
            'category': 'English',
            'id': 2,
            'name': 'Language',
            'link': '2-language'
        },
        {
            'category': 'Maths',
            'id': 1,
            'name': 'Mathematics',
            'link': '1-mathematics'
        },
    ]
Example #14
0
async def test_show_permissions(cli, db_conn, company):
    await db_conn.execute(sa_contractors.insert().values(
        id=1,
        company=company.id,
        first_name='Fred',
        last_name='Bloggs',
        last_updated=datetime.now(),
        labels=['foo', 'bar'],
        review_rating=3.5,
        review_duration=1800,
    ))

    url = cli.server.app.router['contractor-list'].url_for(
        company=company.public_key)
    r = await cli.get(url)
    assert r.status == 200, await r.text()
    obj = await r.json()
    assert obj['count'] == 1, obj
    results = obj['results']
    assert len(results) == 1, obj
    assert 'labels' not in results[0], results[0]
    assert 'review_rating' not in results[0], results[0]
    assert 'review_duration' not in results[0], results[0]

    await db_conn.execute(
        update(sa_companies).values(options={
            'show_labels': True,
            'show_stars': True,
            'show_hours_reviewed': True
        }))

    r = await cli.get(url)
    assert r.status == 200, await r.text()
    obj = await r.json()
    results = obj['results']
    assert results[0]['labels'] == ['foo', 'bar'], results[0]
    assert results[0]['review_rating'] == 3.5, results[0]
    assert results[0]['review_duration'] == 1800, results[0]
Example #15
0
async def test_sorting(cli, db_conn, company, sort, cons):
    await db_conn.execute(sa_contractors.insert().values([
        dict(
            id=1,
            company=company.id,
            first_name='Anne',
            last_name='x',
            last_updated=datetime(2032, 1, 1),
            review_rating=4,
            review_duration=1000,
        ),
        dict(
            id=2,
            company=company.id,
            first_name='Ben',
            last_name='x',
            last_updated=datetime(2032, 1, 2),
            review_rating=4.5,
            review_duration=50,
        ),
        dict(
            id=3,
            company=company.id,
            first_name='Charlie',
            last_name='x',
            last_updated=datetime(2032, 1, 3),
            review_rating=4.5,
            review_duration=100,
        ),
        dict(
            id=4,
            company=company.id,
            first_name='Dave',
            last_name='x',
            last_updated=datetime(2032, 1, 4),
            review_rating=1,
            review_duration=0,
        ),
        dict(
            id=5,
            company=company.id,
            first_name='Edgar',
            last_name='x',
            last_updated=datetime(2032, 1, 5),
            review_rating=None,
            review_duration=0,
        ),
        dict(
            id=6,
            company=company.id,
            first_name='Fred',
            last_name='x',
            last_updated=datetime(2032, 1, 6),
            review_rating=4,
            review_duration=0,
        ),
    ]))
    await create_labels(db_conn, company)

    await db_conn.execute(
        update(sa_contractors).values(
            labels=['apple', 'banana', 'carrot']).where(
                sa_contractors.c.id == 1))
    await db_conn.execute(
        update(sa_contractors).values(labels=['apple']).where(
            sa_contractors.c.id == 2))
    await db_conn.execute(
        update(sa_contractors).values(labels=['banana', 'carrot']).where(
            sa_contractors.c.id == 3))

    url = str(cli.server.app.router['contractor-list'].url_for(
        company=company.public_key))
    r = await cli.get(url + '?sort=' + sort)
    assert r.status == 200, await r.text()
    obj = await r.json()
    assert [c['link'] for c in obj['results']] == cons
async def test_get_contractor(cli, db_conn, settings):
    v = await db_conn.execute(sa_companies.insert().values(
        name='testing', public_key='thepublickey',
        private_key='theprivatekey').returning(sa_companies.c.id))
    r = await v.first()
    company_id = r.id
    v = await db_conn.execute(sa_contractors.insert().values(
        id=1,
        company=company_id,
        first_name='Fred',
        last_name='Bloggs',
        last_updated=datetime.now(),
        extra_attributes=[{
            'sort_index': 5,
            'foo': 'bar'
        }, {
            'foo': 'apple'
        }, {
            'sort_index': 1,
            'foo': 'spam'
        }],
    ).returning(sa_contractors.c.id))
    con_id = (await v.first()).id
    await create_con_skills(db_conn, con_id)

    r = await cli.get(cli.server.app.router['contractor-get'].url_for(
        company='thepublickey', id=str(con_id), slug='x'))
    assert r.status == 200
    obj = await r.json()
    assert {
        'id':
        1,
        'name':
        'Fred B',
        'town':
        None,
        'country':
        None,
        'extra_attributes': [{
            'sort_index': 1,
            'foo': 'spam'
        }, {
            'sort_index': 5,
            'foo': 'bar'
        }, {
            'foo': 'apple'
        }],
        'labels': [],
        'tag_line':
        None,
        'photo':
        f'{settings.images_url}/thepublickey/1.jpg?h=-',
        'primary_description':
        None,
        'review_duration':
        None,
        'review_rating':
        None,
        'skills': [
            {
                'category': 'English',
                'qual_levels': ['A Level'],
                'subject': 'Language'
            },
            {
                'category': 'Maths',
                'qual_levels': ['GCSE'],
                'subject': 'Mathematics'
            },
        ],
    } == obj