Newer
Older
% This file is a part of the CaosDB Project.
%
% Copyright (C) 2021 IndiScale GmbH <info@indiscale.com>
% Copyright (C) 2021 Daniel Hornung <d.hornung@indiscale.com>
%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU Affero General Public License as
% published by the Free Software Foundation, either version 3 of the
% License, or (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU Affero General Public License for more details.
%
% You should have received a copy of the GNU Affero General Public License
% along with this program. If not, see <https://www.gnu.org/licenses/>.
%% The main function which intitializes the tests.
function test_suite = test_caosdb()
try % assignment of 'localfunctions' is necessary in Matlab >= 2016
catch % no problem; early Matlab versions can use initTestSuite fine
end
initTestSuite;
end
%% Only test the connection
function test_connection()
% Default connection
c1 = Caosdb();
info = c1.info();
% another working connection
c2.info();
% This connection should fail
% c3 = Caosdb(connection = "does-not-exist");
% Error message is:
% maox_info: The ConnectionManager does not know any connection of this name.
% No connection named 'does-not-exist' present.
assertExceptionThrown(@non_existing_connection, "16");
strjoin({"maox_info: The ConnectionManager does not know any connection of this name.", ...
"No connection named 'does-not-exist' present."}, "\n");
assertEqual(lasterror().message, expected_msg);
%% Test retrieval of a single Entity
function test_retrieve_single()
% Default connection configuration is sufficient.
c = Caosdb();
% Retrieve a single entity
% Check content
assertEqual(violin.name, "Sherlock Holmes' violin");
assertEqual(props{1}.name, "price");
assertEqual(props{1}.value, 814873.0);
assertEqual(props{2}.name, "Manufacturer");
assertEqual(props{2}.value, "119");
assertFalse(violin.has_errors());
assertFalse(violin.has_warnings());
assertFalse(violin.has_infos());
end
%% Test retrieval of multiple Entities
violin = c.retrieve_by_id("120"){1};
collection = c.retrieve_by_id({"120", "119"});
assertEqual(length(collection), 2);
assertEqual(collection{1}.id, violin.id);
assertEqual(collection{1}.name, violin.name);
assertEqual(collection{2}.name, "Antonio Stradivari");
props = collection{2}.get_properties();
assertEqual(props{1}.name, "latitude");
assertEqual(props{1}.value, 45.07353);
assertEqual(props{2}.name, "longitude");
assertEqual(props{2}.value, 7.68315);
%% Test query execution
function test_execute_query()
c = Caosdb();
query = ['FIND Record Violin WITH name="Sherlock Holmes' "'" ' violin"'];
results = c.query(query);
assertFalse(isempty(results));
violin = results{1};
props = violin.get_properties();
assertEqual(props{1}.name, "price");
assertEqual(props{1}.value, 814873.0);
assertEqual(props{2}.name, "Manufacturer");
assertEqual(props{2}.value, "119");
% COUNT query
% TODO still fails with current libcaosdb@dev %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% query = ['COUNT Record Violin'];
% count = c.query(query);
% assertTrue(isscalar(count));
% assertEqual(count, int64(4));
end
% Error handling tests %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Test retrieval with errors
function test_retrieve_failure()
% Default connection configuration is sufficient.
c = Caosdb();
% Retrieve a non-existing entity.
does_not_exist = c.retrieve_by_id("i-do-not-exist"){1};
assertTrue(does_not_exist.has_errors());
error = does_not_exist.get_errors(){1};
assertEqual(typeinfo(error.code), "int64 scalar");
assertEqual(error.code, int64(2));
assertEqual(error.description, "Entity does not exist.");
%% Test querying with errors
function test_execute_query_failure()
c = Caosdb();
results = c.query("FIND Record I-Do-Not-Exist"); % Must not segfault.
assertTrue(isempty(results));