Deploying to gh-pages from @ ac502b7c08 🚀

This commit is contained in:
realaravinth
2022-11-04 10:05:00 +00:00
parent 49538a56a4
commit 55a5f29113
941 changed files with 22322 additions and 30474 deletions

View File

@@ -1,4 +1,4 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `db/db-core/src/tests.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>tests.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled><link rel="stylesheet" type="text/css" href="../../dark.css" disabled><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script defer src="../../source-script.js"></script><script defer src="../../source-files.js"></script><script defer src="../../main.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">&#9776;</button><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a><h2 class="location"></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../db_core/index.html"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></a><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><button type="button">?</button></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div></div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1">1</span>
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `db/db-core/src/tests.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>tests.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" href="../../normalize.css"><link rel="stylesheet" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" href="../../ayu.css" disabled><link rel="stylesheet" href="../../dark.css" disabled><link rel="stylesheet" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script defer src="../../source-script.js"></script><script defer src="../../source-files.js"></script><script defer src="../../main.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">&#9776;</button><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a><h2 class="location"></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../db_core/index.html"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></a><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><button type="button">?</button></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div></div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1">1</span>
<span id="2">2</span>
<span id="3">3</span>
<span id="4">4</span>
@@ -311,226 +311,226 @@
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see &lt;https://www.gnu.org/licenses/&gt;.
*/</span>
<span class="doccomment">//! Test utilities</span>
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::errors</span>::<span class="kw-2">*</span>;
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::prelude</span>::<span class="kw-2">*</span>;
*/
</span><span class="doccomment">//! Test utilities
</span><span class="kw">use </span><span class="kw">crate</span>::errors::<span class="kw-2">*</span>;
<span class="kw">use </span><span class="kw">crate</span>::prelude::<span class="kw-2">*</span>;
<span class="doccomment">/// test all database functions</span>
<span class="kw">pub</span> <span class="kw">async</span> <span class="kw">fn</span> <span class="ident">database_works</span><span class="op">&lt;</span><span class="lifetime">&#39;a</span>, <span class="ident">T</span>: <span class="ident">MCDatabase</span><span class="op">&gt;</span>(
<span class="ident">db</span>: <span class="kw-2">&amp;</span><span class="ident">T</span>,
<span class="ident">p</span>: <span class="kw-2">&amp;</span><span class="ident">Register</span><span class="op">&lt;</span><span class="lifetime">&#39;a</span><span class="op">&gt;</span>,
<span class="ident">c</span>: <span class="kw-2">&amp;</span><span class="ident">CreateCaptcha</span><span class="op">&lt;</span><span class="lifetime">&#39;a</span><span class="op">&gt;</span>,
<span class="ident">l</span>: <span class="kw-2">&amp;</span>[<span class="ident">Level</span>],
<span class="ident">tp</span>: <span class="kw-2">&amp;</span><span class="ident">TrafficPattern</span>,
<span class="ident">an</span>: <span class="kw-2">&amp;</span><span class="ident">AddNotification</span><span class="op">&lt;</span><span class="lifetime">&#39;a</span><span class="op">&gt;</span>,
<span class="doccomment">/// test all database functions
</span><span class="kw">pub async fn </span>database_works&lt;<span class="lifetime">&#39;a</span>, T: MCDatabase&gt;(
db: <span class="kw-2">&amp;</span>T,
p: <span class="kw-2">&amp;</span>Register&lt;<span class="lifetime">&#39;a</span>&gt;,
c: <span class="kw-2">&amp;</span>CreateCaptcha&lt;<span class="lifetime">&#39;a</span>&gt;,
l: <span class="kw-2">&amp;</span>[Level],
tp: <span class="kw-2">&amp;</span>TrafficPattern,
an: <span class="kw-2">&amp;</span>AddNotification&lt;<span class="lifetime">&#39;a</span>&gt;,
) {
<span class="macro">assert!</span>(<span class="ident">db</span>.<span class="ident">ping</span>().<span class="kw">await</span>, <span class="string">&quot;ping test&quot;</span>);
<span class="macro">assert!</span>(db.ping().<span class="kw">await</span>, <span class="string">&quot;ping test&quot;</span>);
<span class="kw">if</span> <span class="ident">db</span>.<span class="ident">username_exists</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>() {
<span class="ident">db</span>.<span class="ident">delete_user</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="kw">if </span>db.username_exists(p.username).<span class="kw">await</span>.unwrap() {
db.delete_user(p.username).<span class="kw">await</span>.unwrap();
<span class="macro">assert!</span>(
<span class="op">!</span><span class="ident">db</span>.<span class="ident">username_exists</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
<span class="string">&quot;user is deleted so username shouldn&#39;t exist&quot;</span>
);
!db.username_exists(p.username).<span class="kw">await</span>.unwrap(),
<span class="string">&quot;user is deleted so username shouldn&#39;t exist&quot;
</span>);
}
<span class="macro">assert!</span>(<span class="macro">matches!</span>(
<span class="ident">db</span>.<span class="ident">get_secret</span>(<span class="kw-2">&amp;</span><span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>,
<span class="prelude-val">Err</span>(<span class="ident">DBError::AccountNotFound</span>)
db.get_secret(<span class="kw-2">&amp;</span>p.username).<span class="kw">await</span>,
<span class="prelude-val">Err</span>(DBError::AccountNotFound)
));
<span class="ident">db</span>.<span class="ident">register</span>(<span class="ident">p</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
db.register(p).<span class="kw">await</span>.unwrap();
<span class="macro">assert!</span>(<span class="macro">matches!</span>(<span class="ident">db</span>.<span class="ident">register</span>(<span class="kw-2">&amp;</span><span class="ident">p</span>).<span class="kw">await</span>, <span class="prelude-val">Err</span>(<span class="ident">DBError::UsernameTaken</span>)));
<span class="macro">assert!</span>(<span class="macro">matches!</span>(db.register(<span class="kw-2">&amp;</span>p).<span class="kw">await</span>, <span class="prelude-val">Err</span>(DBError::UsernameTaken)));
<span class="comment">// testing get secret</span>
<span class="kw">let</span> <span class="ident">secret</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_secret</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="macro">assert_eq!</span>(<span class="ident">secret</span>.<span class="ident">secret</span>, <span class="ident">p</span>.<span class="ident">secret</span>, <span class="string">&quot;user secret matches&quot;</span>);
<span class="comment">// testing get secret
</span><span class="kw">let </span>secret = db.get_secret(p.username).<span class="kw">await</span>.unwrap();
<span class="macro">assert_eq!</span>(secret.secret, p.secret, <span class="string">&quot;user secret matches&quot;</span>);
<span class="comment">// testing update secret: setting secret = username</span>
<span class="ident">db</span>.<span class="ident">update_secret</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="comment">// testing update secret: setting secret = username
</span>db.update_secret(p.username, p.username).<span class="kw">await</span>.unwrap();
<span class="kw">let</span> <span class="ident">secret</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_secret</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="kw">let </span>secret = db.get_secret(p.username).<span class="kw">await</span>.unwrap();
<span class="macro">assert_eq!</span>(
<span class="ident">secret</span>.<span class="ident">secret</span>, <span class="ident">p</span>.<span class="ident">username</span>,
<span class="string">&quot;user secret matches username; as set by previous step&quot;</span>
secret.secret, p.username,
<span class="string">&quot;user secret matches username; as set by previous step&quot;
</span>);
<span class="comment">// testing get_password
// with username
</span><span class="kw">let </span>name_hash = db.get_password(<span class="kw-2">&amp;</span>Login::Username(p.username)).<span class="kw">await</span>.unwrap();
<span class="macro">assert_eq!</span>(name_hash.hash, p.hash, <span class="string">&quot;user password matches&quot;</span>);
<span class="macro">assert_eq!</span>(name_hash.username, p.username, <span class="string">&quot;username matches&quot;</span>);
<span class="comment">// with email
</span><span class="kw">let </span><span class="kw-2">mut </span>name_hash = db
.get_password(<span class="kw-2">&amp;</span>Login::Email(p.email.as_ref().unwrap()))
.<span class="kw">await
</span>.unwrap();
<span class="macro">assert_eq!</span>(name_hash.hash, p.hash, <span class="string">&quot;user password matches&quot;</span>);
<span class="macro">assert_eq!</span>(name_hash.username, p.username, <span class="string">&quot;username matches&quot;</span>);
<span class="comment">// testing get_email
</span><span class="macro">assert_eq!</span>(
db.get_email(p.username)
.<span class="kw">await
</span>.unwrap()
.as_ref()
.unwrap()
.as_str(),
p.email.unwrap()
);
<span class="comment">// testing get_password</span>
<span class="comment">// testing email exists
</span><span class="macro">assert!</span>(
db.email_exists(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap(),
<span class="string">&quot;user is registered so email should exist&quot;
</span>);
<span class="macro">assert!</span>(
db.username_exists(p.username).<span class="kw">await</span>.unwrap(),
<span class="string">&quot;user is registered so username should exist&quot;
</span>);
<span class="comment">// with username</span>
<span class="kw">let</span> <span class="ident">name_hash</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_password</span>(<span class="kw-2">&amp;</span><span class="ident">Login::Username</span>(<span class="ident">p</span>.<span class="ident">username</span>)).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="macro">assert_eq!</span>(<span class="ident">name_hash</span>.<span class="ident">hash</span>, <span class="ident">p</span>.<span class="ident">hash</span>, <span class="string">&quot;user password matches&quot;</span>);
<span class="comment">// update password test. setting password = username
</span>name_hash.hash = name_hash.username.clone();
db.update_password(<span class="kw-2">&amp;</span>name_hash).<span class="kw">await</span>.unwrap();
<span class="macro">assert_eq!</span>(<span class="ident">name_hash</span>.<span class="ident">username</span>, <span class="ident">p</span>.<span class="ident">username</span>, <span class="string">&quot;username matches&quot;</span>);
<span class="comment">// with email</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">name_hash</span> <span class="op">=</span> <span class="ident">db</span>
.<span class="ident">get_password</span>(<span class="kw-2">&amp;</span><span class="ident">Login::Email</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()))
.<span class="kw">await</span>
.<span class="ident">unwrap</span>();
<span class="macro">assert_eq!</span>(<span class="ident">name_hash</span>.<span class="ident">hash</span>, <span class="ident">p</span>.<span class="ident">hash</span>, <span class="string">&quot;user password matches&quot;</span>);
<span class="macro">assert_eq!</span>(<span class="ident">name_hash</span>.<span class="ident">username</span>, <span class="ident">p</span>.<span class="ident">username</span>, <span class="string">&quot;username matches&quot;</span>);
<span class="comment">// testing get_email</span>
<span class="kw">let </span>name_hash = db.get_password(<span class="kw-2">&amp;</span>Login::Username(p.username)).<span class="kw">await</span>.unwrap();
<span class="macro">assert_eq!</span>(
<span class="ident">db</span>.<span class="ident">get_email</span>(<span class="ident">p</span>.<span class="ident">username</span>)
.<span class="kw">await</span>
.<span class="ident">unwrap</span>()
.<span class="ident">as_ref</span>()
.<span class="ident">unwrap</span>()
.<span class="ident">as_str</span>(),
<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">unwrap</span>()
);
name_hash.hash, p.username,
<span class="string">&quot;user password matches with changed value&quot;
</span>);
<span class="macro">assert_eq!</span>(name_hash.username, p.username, <span class="string">&quot;username matches&quot;</span>);
<span class="comment">// testing email exists</span>
<span class="comment">// update username to p.email
</span><span class="macro">assert!</span>(
!db.username_exists(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap(),
<span class="string">&quot;user with p.email doesn&#39;t exist. pre-check to update username to p.email&quot;
</span>);
db.update_username(p.username, p.email.as_ref().unwrap())
.<span class="kw">await
</span>.unwrap();
<span class="macro">assert!</span>(
<span class="ident">db</span>.<span class="ident">email_exists</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
<span class="string">&quot;user is registered so email should exist&quot;</span>
);
db.username_exists(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap(),
<span class="string">&quot;user with p.email exist post-update&quot;
</span>);
<span class="comment">// deleting user for re-registration with email = None
</span>db.delete_user(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap();
<span class="macro">assert!</span>(
<span class="ident">db</span>.<span class="ident">username_exists</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
<span class="string">&quot;user is registered so username should exist&quot;</span>
);
!db.username_exists(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap(),
<span class="string">&quot;user is deleted so username shouldn&#39;t exist&quot;
</span>);
<span class="comment">// update password test. setting password = username</span>
<span class="ident">name_hash</span>.<span class="ident">hash</span> <span class="op">=</span> <span class="ident">name_hash</span>.<span class="ident">username</span>.<span class="ident">clone</span>();
<span class="ident">db</span>.<span class="ident">update_password</span>(<span class="kw-2">&amp;</span><span class="ident">name_hash</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="ident">name_hash</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_password</span>(<span class="kw-2">&amp;</span><span class="ident">Login::Username</span>(<span class="ident">p</span>.<span class="ident">username</span>)).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="macro">assert_eq!</span>(
<span class="ident">name_hash</span>.<span class="ident">hash</span>, <span class="ident">p</span>.<span class="ident">username</span>,
<span class="string">&quot;user password matches with changed value&quot;</span>
);
<span class="macro">assert_eq!</span>(<span class="ident">name_hash</span>.<span class="ident">username</span>, <span class="ident">p</span>.<span class="ident">username</span>, <span class="string">&quot;username matches&quot;</span>);
<span class="comment">// update username to p.email</span>
<span class="comment">// register with email = None
</span><span class="kw">let </span><span class="kw-2">mut </span>p2 = p.clone();
p2.email = <span class="prelude-val">None</span>;
db.register(<span class="kw-2">&amp;</span>p2).<span class="kw">await</span>.unwrap();
<span class="macro">assert!</span>(
<span class="op">!</span><span class="ident">db</span>.<span class="ident">username_exists</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
<span class="string">&quot;user with p.email doesn&#39;t exist. pre-check to update username to p.email&quot;</span>
);
<span class="ident">db</span>.<span class="ident">update_username</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>())
.<span class="kw">await</span>
.<span class="ident">unwrap</span>();
db.username_exists(p2.username).<span class="kw">await</span>.unwrap(),
<span class="string">&quot;user is registered so username should exist&quot;
</span>);
<span class="macro">assert!</span>(
<span class="ident">db</span>.<span class="ident">username_exists</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
<span class="string">&quot;user with p.email exist post-update&quot;</span>
);
!db.email_exists(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap(),
<span class="string">&quot;user registration with email is deleted; so email shouldn&#39;t exist&quot;
</span>);
<span class="comment">// deleting user for re-registration with email = None</span>
<span class="ident">db</span>.<span class="ident">delete_user</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="macro">assert!</span>(
<span class="op">!</span><span class="ident">db</span>.<span class="ident">username_exists</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
<span class="string">&quot;user is deleted so username shouldn&#39;t exist&quot;</span>
);
<span class="comment">// testing get_email = None
</span><span class="macro">assert_eq!</span>(db.get_email(p.username).<span class="kw">await</span>.unwrap(), <span class="prelude-val">None</span>);
<span class="comment">// register with email = None</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">p2</span> <span class="op">=</span> <span class="ident">p</span>.<span class="ident">clone</span>();
<span class="ident">p2</span>.<span class="ident">email</span> <span class="op">=</span> <span class="prelude-val">None</span>;
<span class="ident">db</span>.<span class="ident">register</span>(<span class="kw-2">&amp;</span><span class="ident">p2</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="macro">assert!</span>(
<span class="ident">db</span>.<span class="ident">username_exists</span>(<span class="ident">p2</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
<span class="string">&quot;user is registered so username should exist&quot;</span>
);
<span class="macro">assert!</span>(
<span class="op">!</span><span class="ident">db</span>.<span class="ident">email_exists</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
<span class="string">&quot;user registration with email is deleted; so email shouldn&#39;t exist&quot;</span>
);
<span class="comment">// testing get_email = None</span>
<span class="macro">assert_eq!</span>(<span class="ident">db</span>.<span class="ident">get_email</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>(), <span class="prelude-val">None</span>);
<span class="comment">// testing update email</span>
<span class="kw">let</span> <span class="ident">update_email</span> <span class="op">=</span> <span class="ident">UpdateEmail</span> {
<span class="ident">username</span>: <span class="ident">p</span>.<span class="ident">username</span>,
<span class="ident">new_email</span>: <span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>(),
<span class="comment">// testing update email
</span><span class="kw">let </span>update_email = UpdateEmail {
username: p.username,
new_email: p.email.as_ref().unwrap(),
};
<span class="ident">db</span>.<span class="ident">update_email</span>(<span class="kw-2">&amp;</span><span class="ident">update_email</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
db.update_email(<span class="kw-2">&amp;</span>update_email).<span class="kw">await</span>.unwrap();
<span class="macro">println!</span>(
<span class="string">&quot;null user email: {}&quot;</span>,
<span class="ident">db</span>.<span class="ident">email_exists</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>()
db.email_exists(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap()
);
<span class="macro">assert!</span>(
<span class="ident">db</span>.<span class="ident">email_exists</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
<span class="string">&quot;user was with empty email but email is set; so email should exist&quot;</span>
);
db.email_exists(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap(),
<span class="string">&quot;user was with empty email but email is set; so email should exist&quot;
</span>);
<span class="comment">/*
* test notification workflows
* 1. Add notifications: a minimum of two, to mark as read and test if it has affected it
* 2. Get unread notifications
* 3. Mark a notification read, check if it has affected Step #2
*/</span>
*/
<span class="comment">// 1. add notification</span>
<span class="ident">db</span>.<span class="ident">create_notification</span>(<span class="ident">an</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="ident">db</span>.<span class="ident">create_notification</span>(<span class="ident">an</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
// 1. add notification
</span>db.create_notification(an).<span class="kw">await</span>.unwrap();
db.create_notification(an).<span class="kw">await</span>.unwrap();
<span class="comment">// 2. Get notifications</span>
<span class="kw">let</span> <span class="ident">notifications</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_all_unread_notifications</span>(<span class="ident">an</span>.<span class="ident">to</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="macro">assert_eq!</span>(<span class="ident">notifications</span>.<span class="ident">len</span>(), <span class="number">2</span>);
<span class="macro">assert_eq!</span>(<span class="ident">notifications</span>[<span class="number">0</span>].<span class="ident">heading</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>(), <span class="ident">an</span>.<span class="ident">heading</span>);
<span class="comment">// 2. Get notifications
</span><span class="kw">let </span>notifications = db.get_all_unread_notifications(an.to).<span class="kw">await</span>.unwrap();
<span class="macro">assert_eq!</span>(notifications.len(), <span class="number">2</span>);
<span class="macro">assert_eq!</span>(notifications[<span class="number">0</span>].heading.as_ref().unwrap(), an.heading);
<span class="comment">// 3. mark a notification read</span>
<span class="ident">db</span>.<span class="ident">mark_notification_read</span>(<span class="ident">an</span>.<span class="ident">to</span>, <span class="ident">notifications</span>[<span class="number">0</span>].<span class="ident">id</span>.<span class="ident">unwrap</span>())
.<span class="kw">await</span>
.<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="ident">new_notifications</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_all_unread_notifications</span>(<span class="ident">an</span>.<span class="ident">to</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="macro">assert_eq!</span>(<span class="ident">new_notifications</span>.<span class="ident">len</span>(), <span class="number">1</span>);
<span class="comment">// 3. mark a notification read
</span>db.mark_notification_read(an.to, notifications[<span class="number">0</span>].id.unwrap())
.<span class="kw">await
</span>.unwrap();
<span class="kw">let </span>new_notifications = db.get_all_unread_notifications(an.to).<span class="kw">await</span>.unwrap();
<span class="macro">assert_eq!</span>(new_notifications.len(), <span class="number">1</span>);
<span class="comment">// create captcha</span>
<span class="ident">db</span>.<span class="ident">create_captcha</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="macro">assert!</span>(<span class="ident">db</span>.<span class="ident">captcha_exists</span>(<span class="prelude-val">None</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>());
<span class="macro">assert!</span>(<span class="ident">db</span>.<span class="ident">captcha_exists</span>(<span class="prelude-val">Some</span>(<span class="ident">p</span>.<span class="ident">username</span>), <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>());
<span class="comment">// create captcha
</span>db.create_captcha(p.username, c).<span class="kw">await</span>.unwrap();
<span class="macro">assert!</span>(db.captcha_exists(<span class="prelude-val">None</span>, c.key).<span class="kw">await</span>.unwrap());
<span class="macro">assert!</span>(db.captcha_exists(<span class="prelude-val">Some</span>(p.username), c.key).<span class="kw">await</span>.unwrap());
<span class="comment">// get secret from captcha key</span>
<span class="kw">let</span> <span class="ident">secret_from_captcha</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_secret_from_captcha</span>(<span class="kw-2">&amp;</span><span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="macro">assert_eq!</span>(<span class="ident">secret_from_captcha</span>.<span class="ident">secret</span>, <span class="ident">p</span>.<span class="ident">secret</span>, <span class="string">&quot;user secret matches&quot;</span>);
<span class="comment">// get secret from captcha key
</span><span class="kw">let </span>secret_from_captcha = db.get_secret_from_captcha(<span class="kw-2">&amp;</span>c.key).<span class="kw">await</span>.unwrap();
<span class="macro">assert_eq!</span>(secret_from_captcha.secret, p.secret, <span class="string">&quot;user secret matches&quot;</span>);
<span class="comment">// get captcha configuration</span>
<span class="kw">let</span> <span class="ident">captcha</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_captcha_config</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="macro">assert_eq!</span>(<span class="ident">captcha</span>.<span class="ident">key</span>, <span class="ident">c</span>.<span class="ident">key</span>);
<span class="macro">assert_eq!</span>(<span class="ident">captcha</span>.<span class="ident">duration</span>, <span class="ident">c</span>.<span class="ident">duration</span>);
<span class="macro">assert_eq!</span>(<span class="ident">captcha</span>.<span class="ident">description</span>, <span class="ident">c</span>.<span class="ident">description</span>);
<span class="comment">// get captcha configuration
</span><span class="kw">let </span>captcha = db.get_captcha_config(p.username, c.key).<span class="kw">await</span>.unwrap();
<span class="macro">assert_eq!</span>(captcha.key, c.key);
<span class="macro">assert_eq!</span>(captcha.duration, c.duration);
<span class="macro">assert_eq!</span>(captcha.description, c.description);
<span class="comment">// get all captchas that belong to user</span>
<span class="kw">let</span> <span class="ident">all_user_captchas</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_all_user_captchas</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="macro">assert_eq!</span>(<span class="ident">all_user_captchas</span>.<span class="ident">len</span>(), <span class="number">1</span>);
<span class="macro">assert_eq!</span>(<span class="ident">all_user_captchas</span>[<span class="number">0</span>], <span class="ident">captcha</span>);
<span class="comment">// get all captchas that belong to user
</span><span class="kw">let </span>all_user_captchas = db.get_all_user_captchas(p.username).<span class="kw">await</span>.unwrap();
<span class="macro">assert_eq!</span>(all_user_captchas.len(), <span class="number">1</span>);
<span class="macro">assert_eq!</span>(all_user_captchas[<span class="number">0</span>], captcha);
<span class="comment">// get captcha cooldown duration</span>
<span class="macro">assert_eq!</span>(<span class="ident">db</span>.<span class="ident">get_captcha_cooldown</span>(<span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>(), <span class="ident">c</span>.<span class="ident">duration</span>);
<span class="comment">// get captcha cooldown duration
</span><span class="macro">assert_eq!</span>(db.get_captcha_cooldown(c.key).<span class="kw">await</span>.unwrap(), c.duration);
<span class="comment">// add traffic pattern</span>
<span class="ident">db</span>.<span class="ident">add_traffic_pattern</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>, <span class="ident">tp</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="comment">// add traffic pattern
</span>db.add_traffic_pattern(p.username, c.key, tp).<span class="kw">await</span>.unwrap();
<span class="macro">assert_eq!</span>(
<span class="kw-2">&amp;</span><span class="ident">db</span>.<span class="ident">get_traffic_pattern</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
<span class="ident">tp</span>
<span class="kw-2">&amp;</span>db.get_traffic_pattern(p.username, c.key).<span class="kw">await</span>.unwrap(),
tp
);
<span class="comment">// delete traffic pattern</span>
<span class="ident">db</span>.<span class="ident">delete_traffic_pattern</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="comment">// delete traffic pattern
</span>db.delete_traffic_pattern(p.username, c.key).<span class="kw">await</span>.unwrap();
<span class="macro">assert!</span>(
<span class="macro">matches!</span>(
<span class="ident">db</span>.<span class="ident">get_traffic_pattern</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>,
<span class="prelude-val">Err</span>(<span class="ident">DBError::TrafficPatternNotFound</span>)
db.get_traffic_pattern(p.username, c.key).<span class="kw">await</span>,
<span class="prelude-val">Err</span>(DBError::TrafficPatternNotFound)
),
<span class="string">&quot;deletion successful; traffic pattern no longer exists&quot;</span>
);
<span class="string">&quot;deletion successful; traffic pattern no longer exists&quot;
</span>);
<span class="comment">// add captcha levels</span>
<span class="ident">db</span>.<span class="ident">add_captcha_levels</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>, <span class="ident">l</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="comment">// add captcha levels
</span>db.add_captcha_levels(p.username, c.key, l).<span class="kw">await</span>.unwrap();
<span class="comment">// get captcha levels with username</span>
<span class="kw">let</span> <span class="ident">levels</span> <span class="op">=</span> <span class="ident">db</span>
.<span class="ident">get_captcha_levels</span>(<span class="prelude-val">Some</span>(<span class="ident">p</span>.<span class="ident">username</span>), <span class="ident">c</span>.<span class="ident">key</span>)
.<span class="kw">await</span>
.<span class="ident">unwrap</span>();
<span class="macro">assert_eq!</span>(<span class="ident">levels</span>, <span class="ident">l</span>);
<span class="comment">// get captcha levels without username</span>
<span class="kw">let</span> <span class="ident">levels</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_captcha_levels</span>(<span class="prelude-val">None</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="macro">assert_eq!</span>(<span class="ident">levels</span>, <span class="ident">l</span>);
<span class="comment">// get captcha levels with username
</span><span class="kw">let </span>levels = db
.get_captcha_levels(<span class="prelude-val">Some</span>(p.username), c.key)
.<span class="kw">await
</span>.unwrap();
<span class="macro">assert_eq!</span>(levels, l);
<span class="comment">// get captcha levels without username
</span><span class="kw">let </span>levels = db.get_captcha_levels(<span class="prelude-val">None</span>, c.key).<span class="kw">await</span>.unwrap();
<span class="macro">assert_eq!</span>(levels, l);
<span class="comment">/*
* Test stats
@@ -540,59 +540,59 @@
* 4. fetch config fetches
* 5. fetch solves
* 6. fetch token verify
*/</span>
*/
<span class="macro">assert!</span>(<span class="ident">db</span>
.<span class="ident">fetch_config_fetched</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>)
.<span class="kw">await</span>
.<span class="ident">unwrap</span>()
.<span class="ident">is_empty</span>());
<span class="macro">assert!</span>(<span class="ident">db</span>.<span class="ident">fetch_solve</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>().<span class="ident">is_empty</span>());
<span class="macro">assert!</span>(<span class="ident">db</span>
.<span class="ident">fetch_confirm</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>)
.<span class="kw">await</span>
.<span class="ident">unwrap</span>()
.<span class="ident">is_empty</span>());
</span><span class="macro">assert!</span>(db
.fetch_config_fetched(p.username, c.key)
.<span class="kw">await
</span>.unwrap()
.is_empty());
<span class="macro">assert!</span>(db.fetch_solve(p.username, c.key).<span class="kw">await</span>.unwrap().is_empty());
<span class="macro">assert!</span>(db
.fetch_confirm(p.username, c.key)
.<span class="kw">await
</span>.unwrap()
.is_empty());
<span class="ident">db</span>.<span class="ident">record_fetch</span>(<span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="ident">db</span>.<span class="ident">record_solve</span>(<span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="ident">db</span>.<span class="ident">record_confirm</span>(<span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
db.record_fetch(c.key).<span class="kw">await</span>.unwrap();
db.record_solve(c.key).<span class="kw">await</span>.unwrap();
db.record_confirm(c.key).<span class="kw">await</span>.unwrap();
<span class="macro">assert_eq!</span>(<span class="ident">db</span>.<span class="ident">fetch_solve</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>().<span class="ident">len</span>(), <span class="number">1</span>);
<span class="macro">assert_eq!</span>(db.fetch_solve(p.username, c.key).<span class="kw">await</span>.unwrap().len(), <span class="number">1</span>);
<span class="macro">assert_eq!</span>(
<span class="ident">db</span>.<span class="ident">fetch_config_fetched</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>)
.<span class="kw">await</span>
.<span class="ident">unwrap</span>()
.<span class="ident">len</span>(),
<span class="number">1</span>
);
<span class="macro">assert_eq!</span>(<span class="ident">db</span>.<span class="ident">fetch_solve</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>().<span class="ident">len</span>(), <span class="number">1</span>);
<span class="macro">assert_eq!</span>(<span class="ident">db</span>.<span class="ident">fetch_confirm</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>().<span class="ident">len</span>(), <span class="number">1</span>);
db.fetch_config_fetched(p.username, c.key)
.<span class="kw">await
</span>.unwrap()
.len(),
<span class="number">1
</span>);
<span class="macro">assert_eq!</span>(db.fetch_solve(p.username, c.key).<span class="kw">await</span>.unwrap().len(), <span class="number">1</span>);
<span class="macro">assert_eq!</span>(db.fetch_confirm(p.username, c.key).<span class="kw">await</span>.unwrap().len(), <span class="number">1</span>);
<span class="comment">// update captcha key; set key = username;</span>
<span class="ident">db</span>.<span class="ident">update_captcha_key</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>, <span class="ident">p</span>.<span class="ident">username</span>)
.<span class="kw">await</span>
.<span class="ident">unwrap</span>();
<span class="comment">// checking for captcha with old key; shouldn&#39;t exist</span>
<span class="macro">assert!</span>(<span class="op">!</span><span class="ident">db</span>.<span class="ident">captcha_exists</span>(<span class="prelude-val">Some</span>(<span class="ident">p</span>.<span class="ident">username</span>), <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>());
<span class="comment">// checking for captcha with new key; shouldn exist</span>
<span class="macro">assert!</span>(<span class="ident">db</span>
.<span class="ident">captcha_exists</span>(<span class="prelude-val">Some</span>(<span class="ident">p</span>.<span class="ident">username</span>), <span class="ident">p</span>.<span class="ident">username</span>)
.<span class="kw">await</span>
.<span class="ident">unwrap</span>());
<span class="comment">// update captcha key; set key = username;
</span>db.update_captcha_key(p.username, c.key, p.username)
.<span class="kw">await
</span>.unwrap();
<span class="comment">// checking for captcha with old key; shouldn&#39;t exist
</span><span class="macro">assert!</span>(!db.captcha_exists(<span class="prelude-val">Some</span>(p.username), c.key).<span class="kw">await</span>.unwrap());
<span class="comment">// checking for captcha with new key; shouldn exist
</span><span class="macro">assert!</span>(db
.captcha_exists(<span class="prelude-val">Some</span>(p.username), p.username)
.<span class="kw">await
</span>.unwrap());
<span class="comment">// delete captcha levels</span>
<span class="ident">db</span>.<span class="ident">delete_captcha_levels</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="comment">// delete captcha levels
</span>db.delete_captcha_levels(p.username, c.key).<span class="kw">await</span>.unwrap();
<span class="comment">// update captcha; set description = username and duration *= duration;</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">c2</span> <span class="op">=</span> <span class="ident">c</span>.<span class="ident">clone</span>();
<span class="ident">c2</span>.<span class="ident">duration</span> <span class="kw-2">*</span><span class="op">=</span> <span class="ident">c2</span>.<span class="ident">duration</span>;
<span class="ident">c2</span>.<span class="ident">description</span> <span class="op">=</span> <span class="ident">p</span>.<span class="ident">username</span>;
<span class="ident">db</span>.<span class="ident">update_captcha_metadata</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="kw-2">&amp;</span><span class="ident">c2</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="comment">// update captcha; set description = username and duration *= duration;
</span><span class="kw">let </span><span class="kw-2">mut </span>c2 = c.clone();
c2.duration <span class="kw-2">*</span>= c2.duration;
c2.description = p.username;
db.update_captcha_metadata(p.username, <span class="kw-2">&amp;</span>c2).<span class="kw">await</span>.unwrap();
<span class="comment">// delete captcha; updated key = p.username so invoke delete with it</span>
<span class="ident">db</span>.<span class="ident">delete_captcha</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="macro">assert!</span>(<span class="op">!</span><span class="ident">db</span>.<span class="ident">captcha_exists</span>(<span class="prelude-val">Some</span>(<span class="ident">p</span>.<span class="ident">username</span>), <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>());
<span class="comment">// delete captcha; updated key = p.username so invoke delete with it
</span>db.delete_captcha(p.username, p.username).<span class="kw">await</span>.unwrap();
<span class="macro">assert!</span>(!db.captcha_exists(<span class="prelude-val">Some</span>(p.username), c.key).<span class="kw">await</span>.unwrap());
}
</code></pre></div>
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="db_core" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.64.0 (a55dd71d5 2022-09-19)" ></div></body></html>
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="db_core" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.65.0 (897e37553 2022-11-02)" ></div></body></html>