def METHOD_NAME(self):
    """Test catalog addition, listing, deletion, and merge."""
    # Addition and listing
    self.db.add_catalog('new_cat', VOSCatalog.create('new_cat', 'new_url'))
    self.db.add_catalog_by_url('bar', 'bar.foo', allow_duplicate_url=True)
    assert self.db.list_catalogs() == ['bar', 'foo', 'new_cat']
    assert self.db.list_catalogs(pattern='f') == ['foo']
    assert self.db.list_catalogs_by_url() == ['bar.foo', 'new_url']
    assert self.db.list_catalogs_by_url(pattern='r.f') == ['bar.foo']
    with pytest.raises(DuplicateCatalogName):
        self.db.add_catalog('foo', VOSCatalog.create('my_title', 'my_url'))
    with pytest.raises(DuplicateCatalogURL):
        self.db.add_catalog('foo3', VOSCatalog.create('foo3', 'bar.foo'))
    # Deletion
    # Note: Deletion by URL calls delete_catalog() method.
    self.db.delete_catalog_by_url('bar.foo')
    assert self.db.list_catalogs() == ['new_cat']
    assert self.db.list_catalogs_by_url() == ['new_url']
    assert self.db._url_keys['bar.foo'] == []
    # Merge
    other_db = VOSDatabase.create_empty()
    other_db.add_catalog('o_cat', VOSCatalog.create('o_title', 'o_url'))
    other_db.add_catalog('o_cat2', VOSCatalog.create('o_title2', 'o_url2'))
    new_db = self.db.merge(other_db)
    assert new_db.list_catalogs() == ['new_cat', 'o_cat', 'o_cat2']
    assert new_db.list_catalogs_by_url() == ['new_url', 'o_url', 'o_url2']
    # Make sure inputs are unchanged
    assert self.db.list_catalogs() == ['new_cat']
    assert self.db.list_catalogs_by_url() == ['new_url']
    assert other_db.list_catalogs() == ['o_cat', 'o_cat2']
    assert other_db.list_catalogs_by_url() == ['o_url', 'o_url2']