diff --git a/+dj/+store_plugins/S3.m b/+dj/+store_plugins/S3.m
index 14e7503c..2939b9b0 100644
--- a/+dj/+store_plugins/S3.m
+++ b/+dj/+store_plugins/S3.m
@@ -193,8 +193,8 @@ function remove_object(self, external_filepath)
credential_scope ', ' 'SignedHeaders=' signed_headers ', ' ...
'Signature=' signature];
url = [protocol host canonical_uri '?' canonical_querystring];
-
- if ~strcmpi(method, 'head')
+
+ try
headers = {...
'content_type', content_type; ...
'host', host; ...
@@ -207,6 +207,7 @@ function remove_object(self, external_filepath)
'HeaderFields', headers, ...
'RequestMethod', lower(method), ...
'Timeout', 60, ...
+ 'CertificateFilename', 'default', ...
'ContentType', 'binary', ...
'MediaType', content_type, ...
'CharacterEncoding', 'ISO-8859-1'...
@@ -217,30 +218,34 @@ function remove_object(self, external_filepath)
else
data = webwrite(url, char(payload_bin'), options);
end
- else
- headers = [...
- matlab.net.http.HeaderField('content_type', content_type), ...
- matlab.net.http.HeaderField('host', host), ...
- matlab.net.http.HeaderField('X-Amz-Date', amzdate), ...
- matlab.net.http.HeaderField('X-Amz-Content-Sha256', payload_hash), ...
- matlab.net.http.HeaderField('Authorization', authorization_header), ...
- matlab.net.http.field.AcceptField(...
- [matlab.net.http.MediaType(content_type)]) ...
- ];
-
- request = matlab.net.http.RequestMessage(lower(method), headers, ...
- matlab.net.http.MessageBody(payload_bin));
- response = request.send(url, matlab.net.http.HTTPOptions(...
- 'ConnectTimeout', 60));
- if response.StatusCode ~= matlab.net.http.StatusCode.OK && ...
- response.StatusCode ~= matlab.net.http.StatusCode.NoContent
- error(['DataJoint:RequestError:' char(response.StatusCode)], ...
- 'Request failed on route `%s` with status `%s`.', canonical_uri, ...
- response.StatusLine);
+ catch ME
+ if strcmp(ME.identifier,'MATLAB:weboptions:unrecognizedStringChoice')
+ headers = [...
+ matlab.net.http.HeaderField('content_type', content_type), ...
+ matlab.net.http.HeaderField('host', host), ...
+ matlab.net.http.HeaderField('X-Amz-Date', amzdate), ...
+ matlab.net.http.HeaderField('X-Amz-Content-Sha256', payload_hash), ...
+ matlab.net.http.HeaderField('Authorization', authorization_header), ...
+ matlab.net.http.field.AcceptField(...
+ [matlab.net.http.MediaType(content_type)]) ...
+ ];
+
+ request = matlab.net.http.RequestMessage(lower(method), headers, ...
+ matlab.net.http.MessageBody(payload_bin));
+ response = request.send(url, matlab.net.http.HTTPOptions(...
+ 'ConnectTimeout', 60, 'CertificateFilename', 'default'));
+ if response.StatusCode ~= matlab.net.http.StatusCode.OK && ...
+ response.StatusCode ~= matlab.net.http.StatusCode.NoContent
+ error(['DataJoint:RequestError:' char(response.StatusCode)], ...
+ 'Request failed on route `%s` with status `%s`.', canonical_uri,...
+ response.StatusLine);
+ else
+ data = response.Body.Data;
+ end
else
- data = response.Body.Data;
+ rethrow(ME);
end
- end
+ end
end
end
end
diff --git a/+tests/Main.m b/+tests/Main.m
deleted file mode 100644
index 81422c08..00000000
--- a/+tests/Main.m
+++ /dev/null
@@ -1,11 +0,0 @@
-classdef Main < ...
- tests.TestConfig & ...
- tests.TestConnection & ...
- tests.TestERD & ...
- tests.TestExternalFile & ...
- tests.TestExternalS3 & ...
- tests.TestFetch & ...
- tests.TestProjection & ...
- tests.TestTls & ...
- tests.TestUuid
-end
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index ab48adbc..ed7c6d16 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -23,25 +23,21 @@ jobs:
include:
- <<: *slim
env:
- - MATLAB_VERSION: R2018b
+ - MATLAB_VERSION: R2019a
- MYSQL_TAG: 8.0
- <<: *slim
env:
- - MATLAB_VERSION: R2018b
+ - MATLAB_VERSION: R2019a
- MYSQL_TAG: 5.7
- - <<: *slim
- env:
- - MATLAB_VERSION: R2018b
- - MYSQL_TAG: 5.6
- <<: *slim
env:
- MATLAB_VERSION: R2019a
- - MYSQL_TAG: 8.0
+ - MYSQL_TAG: 5.6
- <<: *slim
env:
- - MATLAB_VERSION: R2019a
+ - MATLAB_VERSION: R2018b
- MYSQL_TAG: 5.7
- <<: *slim
env:
- - MATLAB_VERSION: R2019a
- - MYSQL_TAG: 5.6
\ No newline at end of file
+ - MATLAB_VERSION: R2016b
+ - MYSQL_TAG: 5.7
\ No newline at end of file
diff --git a/README.md b/README.md
index b8da6eb4..37462a77 100644
--- a/README.md
+++ b/README.md
@@ -20,14 +20,15 @@ MYSQL_TAG=5.7
* `cp local-docker-compose.yml docker-compose.yml`
* `docker-compose up` (Note configured `JUPYTER_PASSWORD`)
* Select a means of running MATLAB e.g. Jupyter Notebook, GUI, or Terminal (see bottom)
+* Add `tests` directory to path e.g. in MATLAB, `addpath('tests')`
* Run desired tests. Some examples are as follows:
| Use Case | MATLAB Code |
| ---------------------------- | ------------------------------------------------------------------------------ |
-| Run all tests | `run(tests.Main)` |
-| Run one class of tests | `run(tests.TestTls)` |
-| Run one specific test | `runtests('tests.TestTls/testInsecureConn')` |
-| Run tests based on test name | `import matlab.unittest.TestSuite;`
`import matlab.unittest.selectors.HasName;`
`import matlab.unittest.constraints.ContainsSubstring;`
`suite = TestSuite.fromClass(?tests.Main, ... `
`HasName(ContainsSubstring('Conn')));`
`run(suite)`|
+| Run all tests | `run(Main)` |
+| Run one class of tests | `run(TestTls)` |
+| Run one specific test | `runtests('TestTls/testInsecureConn')` |
+| Run tests based on test name | `import matlab.unittest.TestSuite;`
`import matlab.unittest.selectors.HasName;`
`import matlab.unittest.constraints.ContainsSubstring;`
`suite = TestSuite.fromClass(?Main, ... `
`HasName(ContainsSubstring('Conn')));`
`run(suite)`|
Launch Jupyter Notebook
diff --git a/+tests/+lib/compareVersions.m b/tests/+lib/compareVersions.m
similarity index 100%
rename from +tests/+lib/compareVersions.m
rename to tests/+lib/compareVersions.m
diff --git a/tests/Main.m b/tests/Main.m
new file mode 100644
index 00000000..f66a85b3
--- /dev/null
+++ b/tests/Main.m
@@ -0,0 +1,11 @@
+classdef Main < ...
+ TestConfig & ...
+ TestConnection & ...
+ TestERD & ...
+ TestExternalFile & ...
+ TestExternalS3 & ...
+ TestFetch & ...
+ TestProjection & ...
+ TestTls & ...
+ TestUuid
+end
\ No newline at end of file
diff --git a/+tests/Prep.m b/tests/Prep.m
similarity index 96%
rename from +tests/Prep.m
rename to tests/Prep.m
index 2bbf9ef2..051ebffd 100644
--- a/+tests/Prep.m
+++ b/tests/Prep.m
@@ -23,9 +23,9 @@
methods
function obj = Prep()
% Initialize test_root
- test_pkg_details = what('tests');
+ test_pkg_details = what('dj');
[test_root, ~, ~] = fileparts(test_pkg_details.path);
- obj.test_root = [test_root '/+tests'];
+ obj.test_root = [test_root '/tests'];
if ispc
obj.external_file_store_root = [getenv('TEMP') '\root'];
else
@@ -37,13 +37,14 @@
function init(testCase)
disp('---------------INIT---------------');
clear functions;
+ addpath(testCase.test_root);
addpath([testCase.test_root '/test_schemas']);
curr_conn = dj.conn(testCase.CONN_INFO_ROOT.host, ...
testCase.CONN_INFO_ROOT.user, testCase.CONN_INFO_ROOT.password,'',true);
% create test users
ver = curr_conn.query('select @@version as version').version;
- if tests.lib.compareVersions(ver,'5.8')
+ if lib.compareVersions(ver,'5.8')
cmd = {...
'CREATE USER IF NOT EXISTS ''datajoint''@''%%'' '
'IDENTIFIED BY ''datajoint'';'
@@ -154,6 +155,7 @@ function dispose(testCase)
% delete(['test_schemas/+University/getSchema.m'])
end
rmpath([testCase.test_root '/test_schemas']);
+ % rmpath(testCase.test_root);
warning('on','MATLAB:RMDIR:RemovedFromPath');
end
end
diff --git a/+tests/TestConfig.m b/tests/TestConfig.m
similarity index 85%
rename from +tests/TestConfig.m
rename to tests/TestConfig.m
index e56b13b3..8ca7c91a 100644
--- a/+tests/TestConfig.m
+++ b/tests/TestConfig.m
@@ -1,4 +1,4 @@
-classdef TestConfig < tests.Prep
+classdef TestConfig < Prep
% TestConfig tests scenarios related to initializing DJ config.
methods (Static)
function obj = TestConfig_configRemoveEnvVars(obj, type)
@@ -49,7 +49,7 @@ function TestConfig_configSingleFileTest(test_instance, type, fname, base)
end
% load raw
read_data = fileread(fname);
- obj1 = tests.TestConfig.TestConfig_configRemoveEnvVars(jsondecode(read_data), 'file');
+ obj1 = TestConfig.TestConfig_configRemoveEnvVars(jsondecode(read_data), 'file');
% optional merge from base
if strcmpi(type, 'load-custom')
tmp = rmfield(base, intersect(fieldnames(base), fieldnames(obj1)));
@@ -60,7 +60,7 @@ function TestConfig_configSingleFileTest(test_instance, type, fname, base)
% stringify
file = jsonencode(obj1);
% load config
- obj2 = tests.TestConfig.TestConfig_configRemoveEnvVars(dj.config(), 'config');
+ obj2 = TestConfig.TestConfig_configRemoveEnvVars(dj.config(), 'config');
curr = jsonencode(obj2);
curr = regexprep(curr,'[a-z0-9][A-Z]','${$0(1)}_${lower($0(2))}');
% checks
@@ -142,15 +142,20 @@ function TestConfig_testConfigChecks(testCase)
disp(['---------------' st(1).name '---------------']);
testCase.verifyError(@() dj.config(9), ...
'DataJoint:Config:InvalidType');
- d = testCase.verifyError(@() dj.config('none'), ...
- 'DataJoint:Config:InvalidKey');
+ try
+ d = dj.config('none');
+ catch ME
+ if ~strcmp(ME.identifier,'DataJoint:Config:InvalidKey')
+ rethrow(ME);
+ end
+ end
end
function TestConfig_testRestore(testCase)
st = dbstack;
disp(['---------------' st(1).name '---------------']);
dj.config.restore;
- obj1 = tests.TestConfig.TestConfig_configRemoveEnvVars(dj.config(), 'config');
- obj2 = tests.TestConfig.TestConfig_configRemoveEnvVars( ...
+ obj1 = TestConfig.TestConfig_configRemoveEnvVars(dj.config(), 'config');
+ obj2 = TestConfig.TestConfig_configRemoveEnvVars( ...
orderfields(dj.internal.Settings.DEFAULTS), 'config');
testCase.verifyEqual(jsonencode(obj1), jsonencode(obj2));
end
@@ -161,36 +166,37 @@ function TestConfig_testSave(testCase)
% local
dj.config('font', 10);
- tests.TestConfig.TestConfig_configSingleFileTest(testCase, 'save-local');
+ TestConfig.TestConfig_configSingleFileTest(testCase, 'save-local');
% global
dj.config('font', 12);
- tests.TestConfig.TestConfig_configSingleFileTest(testCase, 'save-global');
+ TestConfig.TestConfig_configSingleFileTest(testCase, 'save-global');
% custom
dj.config('font', 16);
- tests.TestConfig.TestConfig_configSingleFileTest(testCase, 'save-custom', './config.json');
+ TestConfig.TestConfig_configSingleFileTest(...
+ testCase, 'save-custom', './config.json');
dj.config.restore;
end
function TestConfig_testLoad(testCase)
st = dbstack;
disp(['---------------' st(1).name '---------------']);
- pkg = what('tests');
+ pkg_path = testCase.test_root;
% generate default base
- default_file = [pkg.path '/test_schemas/default.json'];
+ default_file = [pkg_path '/test_schemas/default.json'];
dj.config.restore;
dj.config.save(default_file);
- defaults = tests.TestConfig.TestConfig_configRemoveEnvVars( ...
+ defaults = TestConfig.TestConfig_configRemoveEnvVars( ...
jsondecode(fileread(default_file)), 'file');
delete(default_file);
% load test config
- tests.TestConfig.TestConfig_configSingleFileTest(testCase, 'load-custom', ...
- [pkg.path '/test_schemas/config.json'], defaults);
+ TestConfig.TestConfig_configSingleFileTest(testCase, 'load-custom', ...
+ [pkg_path '/test_schemas/config.json'], defaults);
% load new config on top of existing
- base = tests.TestConfig.TestConfig_configRemoveEnvVars(dj.config, 'config');
+ base = TestConfig.TestConfig_configRemoveEnvVars(dj.config, 'config');
base = jsonencode(base);
base = regexprep(base,'[a-z0-9][A-Z]','${$0(1)}_${lower($0(2))}');
- tests.TestConfig.TestConfig_configSingleFileTest(testCase, 'load-custom', ...
- [pkg.path '/test_schemas/config_lite.json'], jsondecode(base));
+ TestConfig.TestConfig_configSingleFileTest(testCase, 'load-custom', ...
+ [pkg_path '/test_schemas/config_lite.json'], jsondecode(base));
% cleanup
dj.config.restore;
end
@@ -210,14 +216,14 @@ function validateEnvVarConfig(type, values)
testCase.verifyEqual(dj.config('databasePassword'), values{3});
testCase.verifyEqual(dj.config('connectionInit_function'), values{4});
end
- pkg = what('tests');
+ pkg_path = testCase.test_root;
setenv('DJ_INIT', 'select @@version;');
dj.config.restore;
% check pulling from env vars
env = {getenv('DJ_HOST'), getenv('DJ_USER'), getenv('DJ_PASS'), getenv('DJ_INIT')};
validateEnvVarConfig('env', env);
% check after load if env vars take precedence
- dj.config.load([pkg.path '/test_schemas/config.json']);
+ dj.config.load([pkg_path '/test_schemas/config.json']);
validateEnvVarConfig('env', env);
% check if overriding env vars is persisted
validateEnvVarConfig('set', ...
diff --git a/+tests/TestConnection.m b/tests/TestConnection.m
similarity index 59%
rename from +tests/TestConnection.m
rename to tests/TestConnection.m
index 92b113a3..f36aaf73 100644
--- a/+tests/TestConnection.m
+++ b/tests/TestConnection.m
@@ -1,4 +1,4 @@
-classdef TestConnection < tests.Prep
+classdef TestConnection < Prep
% TestConnection tests typical connection scenarios.
methods (Test)
function TestConnection_testConnection(testCase)
@@ -39,5 +39,39 @@ function TestConnection_testPort(testCase)
testCase.CONN_INFO.password,'',true), ...
'MySQL:Error');
end
+ function TestConnection_testTransactionRollback(testCase)
+ st = dbstack;
+ disp(['---------------' st(1).name '---------------']);
+ package = 'University';
+
+ c1 = dj.conn(...
+ testCase.CONN_INFO.host,...
+ testCase.CONN_INFO.user,...
+ testCase.CONN_INFO.password,'',true);
+ dj.createSchema(package,[testCase.test_root '/test_schemas'], ...
+ [testCase.PREFIX '_university']);
+ schema = University.getSchema;
+ tmp = {
+ 20 'Henry' 'Jupyter' '2020-11-25 12:34:56'
+ 21 'Lacy' 'Mars' '2017-11-25 12:34:56'
+ };
+
+ insert(University.Student, tmp(1, :));
+
+ schema.conn.startTransaction
+ try
+ insert(University.Student, tmp(2, :));
+ assert(false, 'Customer:Error', 'Message')
+ catch ME
+ schema.conn.cancelTransaction
+ if ~strcmp(ME.identifier,'Customer:Error')
+ rethrow(ME);
+ end
+ end
+
+ q = University.Student & 'student_id in (20,21)';
+ testCase.verifyEqual(q.count, 1);
+ testCase.verifyEqual(q.fetch1('student_id'), 20);
+ end
end
end
\ No newline at end of file
diff --git a/+tests/TestERD.m b/tests/TestERD.m
similarity index 96%
rename from +tests/TestERD.m
rename to tests/TestERD.m
index c400adf2..fae8b73e 100644
--- a/+tests/TestERD.m
+++ b/tests/TestERD.m
@@ -1,4 +1,4 @@
-classdef TestERD < tests.Prep
+classdef TestERD < Prep
% TestERD tests unusual ERD scenarios.
methods (Test)
function TestERD_testDraw(testCase)
diff --git a/+tests/TestExternalFile.m b/tests/TestExternalFile.m
similarity index 92%
rename from +tests/TestExternalFile.m
rename to tests/TestExternalFile.m
index bcc27ed9..8a0051ab 100644
--- a/+tests/TestExternalFile.m
+++ b/tests/TestExternalFile.m
@@ -1,11 +1,11 @@
-classdef TestExternalFile < tests.Prep
+classdef TestExternalFile < Prep
% TestExternalFile tests scenarios related to external file store.
methods (Static)
function TestExternalFile_checks(test_instance, store, cache)
% load config
- pkg = what('tests');
+ pkg_path = test_instance.test_root;
ext_root = strrep(test_instance.external_file_store_root, '\', '/');
- dj.config.load([strrep(pkg.path, '\', '/') '/test_schemas/store_config.json']);
+ dj.config.load([strrep(pkg_path, '\', '/') '/test_schemas/store_config.json']);
dj.config(['stores.' store '.location'], strrep(dj.config(...
['stores.' store '.location']), '{{external_file_store_root}}', ...
ext_root));
@@ -61,7 +61,7 @@ function TestExternalFile_checks(test_instance, store, cache)
'/' dj.config('stores.main.location')], '');
end
subfold_path = strrep(subfold_path, ['/' schema.dbname '/'], '');
- subfold_cell = split(subfold_path, '/');
+ subfold_cell = strsplit(subfold_path, '/');
if length(subfold_cell) > 1
subfold_cell = subfold_cell(1:end-1);
subfold_path = ['/' strjoin(subfold_cell, '/')];
@@ -69,7 +69,7 @@ function TestExternalFile_checks(test_instance, store, cache)
subfold_cell = {};
subfold_path = '';
end
- test_instance.verifyEqual(cellfun(@(x) length(x), subfold_cell), ...
+ test_instance.verifyEqual(cellfun(@(x) length(x), subfold_cell)', ...
schema.external.table('main').spec.type_config.subfolding);
% delete value to rely on cache
schema.external.table('main').spec.remove_object(uuid_path);
@@ -131,23 +131,23 @@ function TestExternalFile_checks(test_instance, store, cache)
function TestExternalFile_testLocal(testCase)
st = dbstack;
disp(['---------------' st(1).name '---------------']);
- tests.TestExternalFile.TestExternalFile_checks(testCase, 'new_local', 'blobCache');
+ TestExternalFile.TestExternalFile_checks(testCase, 'new_local', 'blobCache');
end
function TestExternalFile_testLocalDefault(testCase)
st = dbstack;
disp(['---------------' st(1).name '---------------']);
- tests.TestExternalFile.TestExternalFile_checks(testCase, 'new_local_default', ...
+ TestExternalFile.TestExternalFile_checks(testCase, 'new_local_default', ...
'blobCache');
end
function TestExternalFile_testBackward(testCase)
st = dbstack;
disp(['---------------' st(1).name '---------------']);
- tests.TestExternalFile.TestExternalFile_checks(testCase, 'local', 'cache');
+ TestExternalFile.TestExternalFile_checks(testCase, 'local', 'cache');
end
function TestExternalFile_testBackwardDefault(testCase)
st = dbstack;
disp(['---------------' st(1).name '---------------']);
- tests.TestExternalFile.TestExternalFile_checks(testCase, 'local_default', 'cache');
+ TestExternalFile.TestExternalFile_checks(testCase, 'local_default', 'cache');
end
function TestExternalFile_testMD5Hash(testCase)
st = dbstack;
diff --git a/+tests/TestExternalS3.m b/tests/TestExternalS3.m
similarity index 85%
rename from +tests/TestExternalS3.m
rename to tests/TestExternalS3.m
index 1230ee2d..015dd5d9 100644
--- a/+tests/TestExternalS3.m
+++ b/tests/TestExternalS3.m
@@ -1,27 +1,27 @@
-classdef TestExternalS3 < tests.Prep
+classdef TestExternalS3 < Prep
% TestExternalS3 tests scenarios related to external S3 store.
methods (Test)
function TestExternalS3_testRemote(testCase)
st = dbstack;
disp(['---------------' st(1).name '---------------']);
- tests.TestExternalFile.TestExternalFile_checks(testCase, 'new_remote', ...
+ TestExternalFile.TestExternalFile_checks(testCase, 'new_remote', ...
'blobCache');
end
function TestExternalS3_testRemoteDefault(testCase)
st = dbstack;
disp(['---------------' st(1).name '---------------']);
- tests.TestExternalFile.TestExternalFile_checks(testCase, 'new_remote_default', ...
+ TestExternalFile.TestExternalFile_checks(testCase, 'new_remote_default', ...
'blobCache');
end
function TestExternalS3_testBackward(testCase)
st = dbstack;
disp(['---------------' st(1).name '---------------']);
- tests.TestExternalFile.TestExternalFile_checks(testCase, 'remote', 'cache');
+ TestExternalFile.TestExternalFile_checks(testCase, 'remote', 'cache');
end
function TestExternalS3_testBackwardDefault(testCase)
st = dbstack;
disp(['---------------' st(1).name '---------------']);
- tests.TestExternalFile.TestExternalFile_checks(testCase, 'remote_default', ...
+ TestExternalFile.TestExternalFile_checks(testCase, 'remote_default', ...
'cache');
end
function TestExternalS3_testLocationFlexibility(testCase)
diff --git a/+tests/TestFetch.m b/tests/TestFetch.m
similarity index 97%
rename from +tests/TestFetch.m
rename to tests/TestFetch.m
index 7acaa993..12eb3f3c 100644
--- a/+tests/TestFetch.m
+++ b/tests/TestFetch.m
@@ -1,4 +1,4 @@
-classdef TestFetch < tests.Prep
+classdef TestFetch < Prep
% TestFetch tests typical insert/fetch scenarios.
methods (Static)
function TestFetch_Generic(testCase, id, correct_value, null_value, wrong_value, ...
@@ -264,7 +264,7 @@ function TestFetch_testString(testCase)
dj.createSchema(package,[testCase.test_root '/test_schemas'], ...
[testCase.PREFIX '_university']);
- tests.TestFetch.TestFetch_Generic(testCase, 1, 'n', [], 5, ...
+ TestFetch.TestFetch_Generic(testCase, 1, 'n', [], 5, ...
@(x) strcat(x, 'o'), University.String);
end
function TestFetch_testDate(testCase)
@@ -280,7 +280,7 @@ function TestFetch_testDate(testCase)
dj.createSchema(package,[testCase.test_root '/test_schemas'], ...
[testCase.PREFIX '_university']);
- tests.TestFetch.TestFetch_Generic(testCase, 1, '2020-01-01', [], 5, ...
+ TestFetch.TestFetch_Generic(testCase, 1, '2020-01-01', [], 5, ...
@(x) datestr(addtodate(datenum(x), 1, 'day'), 'yyyy-mm-dd'), University.Date);
end
function TestFetch_testInteger(testCase)
@@ -296,7 +296,7 @@ function TestFetch_testInteger(testCase)
dj.createSchema(package,[testCase.test_root '/test_schemas'], ...
[testCase.PREFIX '_university']);
- tests.TestFetch.TestFetch_Generic(testCase, 1, 2, NaN, 'wrong', ...
+ TestFetch.TestFetch_Generic(testCase, 1, 2, NaN, 'wrong', ...
@(x) x + 1, University.Integer);
end
function TestFetch_testFloat(testCase)
@@ -312,7 +312,7 @@ function TestFetch_testFloat(testCase)
dj.createSchema(package,[testCase.test_root '/test_schemas'], ...
[testCase.PREFIX '_university']);
- tests.TestFetch.TestFetch_Generic(testCase, 1, 1.01, NaN, 'wrong', ...
+ TestFetch.TestFetch_Generic(testCase, 1, 1.01, NaN, 'wrong', ...
@(x) x + 0.01, University.Float);
end
end
diff --git a/+tests/TestProjection.m b/tests/TestProjection.m
similarity index 96%
rename from +tests/TestProjection.m
rename to tests/TestProjection.m
index 0b0b2dac..55db3a6e 100644
--- a/+tests/TestProjection.m
+++ b/tests/TestProjection.m
@@ -1,4 +1,4 @@
-classdef TestProjection < tests.Prep
+classdef TestProjection < Prep
% TestProjection tests use of q.proj(...).
methods (Test)
function TestProjection_testDateConversion(testCase)
diff --git a/+tests/TestTls.m b/tests/TestTls.m
similarity index 95%
rename from +tests/TestTls.m
rename to tests/TestTls.m
index a340afb6..04f84bd8 100644
--- a/+tests/TestTls.m
+++ b/tests/TestTls.m
@@ -1,4 +1,4 @@
-classdef TestTls < tests.Prep
+classdef TestTls < Prep
% TestTls tests TLS connection scenarios.
methods (Test)
function TestTls_testSecureConn(testCase)
@@ -51,7 +51,7 @@ function TestTls_testRejectException(testCase)
e = lasterror;
testCase.verifyEqual(e.identifier, 'MySQL:Error');
testCase.verifyTrue(contains(e.message,...
- ["requires secure connection","Access denied"])); %MySQL8,MySQL5
+ {'requires secure connection','Access denied'})); %MySQL8,MySQL5
end
end
function TestTls_testStructException(testCase)
diff --git a/+tests/TestUuid.m b/tests/TestUuid.m
similarity index 98%
rename from +tests/TestUuid.m
rename to tests/TestUuid.m
index 362b2b3b..946f836d 100644
--- a/+tests/TestUuid.m
+++ b/tests/TestUuid.m
@@ -1,4 +1,4 @@
-classdef TestUuid < tests.Prep
+classdef TestUuid < Prep
% TestUuid tests uuid scenarios.
methods (Test)
function TestUuid_testInsertFetch(testCase)
diff --git a/+tests/test_schemas/+External/Dimension.m b/tests/test_schemas/+External/Dimension.m
similarity index 100%
rename from +tests/test_schemas/+External/Dimension.m
rename to tests/test_schemas/+External/Dimension.m
diff --git a/+tests/test_schemas/+External/Image.m b/tests/test_schemas/+External/Image.m
similarity index 100%
rename from +tests/test_schemas/+External/Image.m
rename to tests/test_schemas/+External/Image.m
diff --git a/+tests/test_schemas/+University/All.m b/tests/test_schemas/+University/All.m
similarity index 100%
rename from +tests/test_schemas/+University/All.m
rename to tests/test_schemas/+University/All.m
diff --git a/+tests/test_schemas/+University/Date.m b/tests/test_schemas/+University/Date.m
similarity index 100%
rename from +tests/test_schemas/+University/Date.m
rename to tests/test_schemas/+University/Date.m
diff --git a/+tests/test_schemas/+University/Float.m b/tests/test_schemas/+University/Float.m
similarity index 100%
rename from +tests/test_schemas/+University/Float.m
rename to tests/test_schemas/+University/Float.m
diff --git a/+tests/test_schemas/+University/Integer.m b/tests/test_schemas/+University/Integer.m
similarity index 100%
rename from +tests/test_schemas/+University/Integer.m
rename to tests/test_schemas/+University/Integer.m
diff --git a/+tests/test_schemas/+University/Message.m b/tests/test_schemas/+University/Message.m
similarity index 100%
rename from +tests/test_schemas/+University/Message.m
rename to tests/test_schemas/+University/Message.m
diff --git a/+tests/test_schemas/+University/String.m b/tests/test_schemas/+University/String.m
similarity index 100%
rename from +tests/test_schemas/+University/String.m
rename to tests/test_schemas/+University/String.m
diff --git a/+tests/test_schemas/+University/Student.m b/tests/test_schemas/+University/Student.m
similarity index 100%
rename from +tests/test_schemas/+University/Student.m
rename to tests/test_schemas/+University/Student.m
diff --git a/+tests/test_schemas/config.json b/tests/test_schemas/config.json
similarity index 100%
rename from +tests/test_schemas/config.json
rename to tests/test_schemas/config.json
diff --git a/+tests/test_schemas/config_lite.json b/tests/test_schemas/config_lite.json
similarity index 100%
rename from +tests/test_schemas/config_lite.json
rename to tests/test_schemas/config_lite.json
diff --git a/+tests/test_schemas/store_config.json b/tests/test_schemas/store_config.json
similarity index 100%
rename from +tests/test_schemas/store_config.json
rename to tests/test_schemas/store_config.json