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'
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' }]
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
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' }
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
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]
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
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' }, ]
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]
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