import pytest from amanuensis.db import * import amanuensis.backend.character as charq from amanuensis.errors import ArgumentError def test_create_character(db: DbContext, lexicon_with_editor, make): """Test creating a character.""" lexicon, user = lexicon_with_editor kwargs = { 'db': db, 'user_id': user.id, 'lexicon_id': lexicon.id, 'name': 'Character Name', 'signature': 'Signature', } # Bad argument types with pytest.raises(ArgumentError): charq.create(**{**kwargs, 'name': b'bytestring'}) with pytest.raises(ArgumentError): charq.create(**{**kwargs, 'name': None}) with pytest.raises(ArgumentError): charq.create(**{**kwargs, 'signature': b'bytestring'}) # Bad character name with pytest.raises(ArgumentError): charq.create(**{**kwargs, 'name': ' '}) # Signature is auto-populated char = charq.create(**{**kwargs, 'signature': None}) assert char.signature is not None # User must be in lexicon new_user = make.user() with pytest.raises(ArgumentError): charq.create(**{**kwargs, 'user_id': new_user.id}) def test_character_limits(db: DbContext, lexicon_with_editor): """Test lexicon settings limiting character creation.""" lexicon: Lexicon user: User lexicon, user = lexicon_with_editor # Set character limit to one and create a character lexicon.character_limit = 1 db.session.commit() char1 = charq.create(db, lexicon.id, user.id, 'Test Character 1', signature=None) assert char1.id, 'Failed to create character 1' # Creating a second character should fail with pytest.raises(ArgumentError): char2 = charq.create(db, lexicon.id, user.id, 'Test Character 2', signature=None) assert char2 # Raising the limit to 2 should allow a second character lexicon.character_limit = 2 db.session.commit() char2 = charq.create(db, lexicon.id, user.id, 'Test Character 2', signature=None) assert char2.id, 'Failed to create character 2' # Creating a third character should fail with pytest.raises(ArgumentError): char3 = charq.create(db, lexicon.id, user.id, 'Test Character 3', signature=None) assert char3 # Setting the limit to null should allow a third character lexicon.character_limit = None db.session.commit() char3 = charq.create(db, lexicon.id, user.id, 'Test Character 3', signature=None) assert char3.id, 'Failed to create character 3'