Files
shopdb-flask/tests/test_plugins/test_employees_resolve.py

69 lines
2.7 KiB
Python

"""Resolving an SSO says HOW it resolved, or why it did not.
Built after the shopfloor board lost every photo and showed lowercase SSOs
instead of names, and nothing in the system could say why. Both resolvers
returned None on any problem, so an unreachable HR host, a rotated credential
and a genuinely unknown SSO were indistinguishable - and none of them were
logged. This endpoint exists to tell those apart.
"""
URL = '/api/employees/resolve/'
def _selfhosted(db):
from shopdb.core.models import Setting
row = Setting.query.filter_by(key='employee_directory_mode').first()
if row:
row.value = 'selfhosted'
else:
db.session.add(Setting(key='employee_directory_mode', value='selfhosted'))
db.session.commit()
def test_a_known_employee_resolves_and_names_its_source(client, db, auth_headers):
from plugins.employees.models import DirectoryEmployee
_selfhosted(db)
db.session.add(DirectoryEmployee(sso=502123, firstname='Ada',
lastname='Lovelace'))
db.session.commit()
data = client.get(URL + '502123', headers=auth_headers).get_json()['data']
assert data['name'] == 'Ada Lovelace'
assert data['source'] == 'directory'
assert data['mode'] == 'selfhosted'
assert data['error'] is None
def test_an_unknown_sso_says_so_rather_than_returning_nothing(client, db,
auth_headers):
"""The board shows a lowercase SSO for this case AND for a broken
directory. The whole point is that they now read differently."""
_selfhosted(db)
data = client.get(URL + '999999', headers=auth_headers).get_json()['data']
assert data['name'] is None
assert data['error']
def test_a_user_account_answers_when_the_directory_does_not(client, db,
auth_headers):
"""Someone from another site has no directory row but does have a login.
That fallback exists; without this endpoint nothing showed it had fired."""
from shopdb.core.models import User
_selfhosted(db)
db.session.add(User(username='701234', firstname='Grace', lastname='Hopper',
email='g@example.com', passwordhash='x'))
db.session.commit()
data = client.get(URL + '701234', headers=auth_headers).get_json()['data']
assert data['name'] == 'Grace Hopper'
assert data['source'] == 'useraccount'
def test_a_non_numeric_sso_is_rejected_clearly(client, db, auth_headers):
data = client.get(URL + 'abc', headers=auth_headers).get_json()['data']
assert data['error'] == 'SSO must be digits'
def test_the_endpoint_needs_a_login(client, db):
assert client.get(URL + '502123').status_code == 401