aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorElvis Claros Castro <elvis@claros.ar>2026-09-26 19:00:45 -0300
committerElvis Claros Castro <elvis@claros.ar>2026-09-26 19:00:45 -0300
commita946ba81f7a6089713337644053b00b825824a98 (patch)
treedf7c98401b3a879a0283e940afa3fecc9453d9d4 /tests
downloaddrae-cli-main.tar.gz
drae-cli-main.zip
drae: the RAE Spanish dictionary in the terminalHEADmain
Diffstat (limited to 'tests')
-rw-r--r--tests/cli.rs62
-rw-r--r--tests/fixtures/dle-casa.html24
2 files changed, 86 insertions, 0 deletions
diff --git a/tests/cli.rs b/tests/cli.rs
new file mode 100644
index 0000000..4d54a55
--- /dev/null
+++ b/tests/cli.rs
@@ -0,0 +1,62 @@
+//! Command-line contract. Everything here runs offline: real lookups are
+//! tested against the fixtures in the unit tests.
+
+use assert_cmd::Command;
+use predicates::prelude::PredicateBooleanExt;
+use predicates::str::contains;
+
+fn drae() -> Command {
+ let mut c = Command::cargo_bin("drae").unwrap();
+ // A separate cache, so the user's is neither touched nor relied upon.
+ c.env("XDG_CACHE_HOME", env!("CARGO_TARGET_TMPDIR"));
+ c.env("NO_COLOR", "1");
+ c
+}
+
+#[test]
+fn prints_help_without_arguments() {
+ drae()
+ .assert()
+ .success()
+ .stdout(contains("Diccionario de la lengua española"))
+ .stdout(contains("conjugar"));
+}
+
+#[test]
+fn reports_its_version() {
+ drae()
+ .arg("--version")
+ .assert()
+ .success()
+ .stdout(contains(env!("CARGO_PKG_VERSION")));
+}
+
+#[test]
+fn search_needs_the_cache() {
+ drae()
+ .args(["buscar", "edificio", "--sin-cache"])
+ .assert()
+ .failure()
+ .stderr(contains("está desactivada"));
+}
+
+#[test]
+fn cache_commands_work_on_an_empty_cache() {
+ drae().args(["cache", "info"]).assert().success();
+ drae()
+ .args(["cache", "listar"])
+ .assert()
+ .success()
+ .stdout(contains("vacía").or(contains("rae-api")));
+}
+
+#[test]
+fn definir_exists_for_words_that_clash_with_command_names() {
+ // `drae sin` is the synonyms command, so the word «sin» is looked up
+ // with `drae definir sin`.
+ drae()
+ .args(["definir", "--help"])
+ .assert()
+ .success()
+ .stdout(contains("PALABRA"));
+}
diff --git a/tests/fixtures/dle-casa.html b/tests/fixtures/dle-casa.html
new file mode 100644
index 0000000..940c42d
--- /dev/null
+++ b/tests/fixtures/dle-casa.html
@@ -0,0 +1,24 @@
+<article class="o-main__article" role="main" id="7lsKMtR">
+
+ <header class="c-page-header js-page-header" role="banner"><a name="7lsKMtR"></a>
+ <div class="c-page-header__container">
+<h1 class="c-page-header__title" title="Definición de casa">casa</h1>
+ </div>
+ </header>
+
+ <div class="o-main">
+ <div class="o-main__container">
+ <div id="navLateral" class="o-main__sidebar">
+
+ <nav class="c-anchors js-anchors" aria-label="Índice de secciones">
+ <ul class="c-anchors__track">
+<li class="c-anchors__track-item"><a href="#7lsKMtR" class="c-anchors__item js-anchor-item">Artículo</a></li><li class="c-anchors__track-item"><a href="#sinonimos7lsKMtR" class="c-anchors__item js-anchor-item">Sinónimos o afines</a></li>
+ </ul></nav>
+
+ </div>
+ <div class="o-main__content">
+ <section class="c-section">
+ <header class="c-section__title u-sr-only">
+ <h2>Definición</h2>
+ </header>
+<div class="n2 c-text-intro">Del <abbr title="lat&#xED;n">lat.</abbr> <em>casa</em> 'choza'.</div><ol class="c-definitions"><li id="LjRHphN" class="j"><div class="c-definitions__item" role="definition"><div><span class="n_acep">1. </span><abbr class="d" title="nombre femenino">f.</abbr> <span data-id="ENa0lL9">Edificio</span> <span data-id="Rp1CuT2|RsVKhBv|RwYmdsn|RxSczPr">para</span> <span data-id="JvaKT39">habitar</span>. <span class="h"><span data-id="b67JJSq|b6hEWeB|b6iKApr">Una</span> <span data-id="7lsKMtR|7mL8hqm|7mLg2Jx">casa</span> <span data-id="BtDkacL|BtFYznp">de</span> <span data-id="QrnUsu1">ocho</span> <span data-id="TKGNG6k|TKQacaC">plantas</span>.</span></div><div class="c-definitions__item-footer"><div class="c-word-list"><div class="c-word-list__label"><abbr class="sin-header-inline d" title="Sin&#xF3;nimos o afines">Sin.:</abbr></div><ul class="c-word-list__items" role="list"><li><span><span class="sin" data-id="byF4Mc7">vivienda</span></span>, <span><span class="sin" data-id="LftS0t0">inmueble</span></span>, <span><span class="sin" data-id="E6cyAL3">domicilio</span></span>, <span><span class="sin" data-id="KYIGBW2">hogar</span></span>, <span><span class="sin" data-id="W9hpKPy">residencia</span></span>, <span><span class="sin" data-id="TD3BxDc">piso</span></span>, <span><span class="sin" data-id="35x3ajw">apartamento</span></span>, <span><span class="sin" data-id="CEajDW3">departamento</span></span>, <span><span class="sin" data-id="ZIMlMTu">techo</span></span>, <span><span class="sin" data-id="35xT48b">apartamiento</span></span>, <span><span class="sin" data-id="BTctS7T">cuarto</span></span>, <span><span class="sin" data-id="7m2X3lH">casalicio</span></span>.</li></ul></div></div></div></li><li id="Mlzmv8T" class="j"><div class="c-definitions__item" role="definition"><div><span class="n_acep">2. </span><abbr class="g" title="nombre femenino">f.</abbr> <span data-id="ENa0lL9">Edificio</span> <span data-id="BtDkacL|BtFYznp">de</span> <span data-id="b67JJSq|b6hEWeB|b6iKApr">una</span> <span data-id="QlqTEX0|Qlr66uc|Qltkqeu">o</span> <span data-id="TTT0e1l">pocas</span> <span data-id="TKGNG6k|TKQacaC">plantas</span> <span data-id="DTtK4Mk|DTy95KP|DTzRYFc">destinado</span> <span data-id="002rZ9U|003Ov93">a</span> <span data-id="byF4Mc7">vivienda</span> <span data-id="b5OMHdV">unifamiliar</span>, <span data-id="EuPaWdO">en</span> <span data-id="R6zXXwD">oposici&#xF3;n</span> <span data-id="002rZ9U|003Ov93">a</span> <i><span data-id="TC7IycY|TD3BxDc">piso</span></i>. <span class="h"><span data-id="UnvXEIb">Quieren</span> <span data-id="bWSrEeQ">vender</span> <span data-id="ESraxkH">el</span> <span data-id="TC7IycY|TD3BxDc">piso</span> <span data-id="c8HoARq|c8HrfrV|c8IFPyp">y</span> <span data-id="A2uSS6N">comprarse</span> <span data-id="b67JJSq|b6hEWeB|b6iKApr">una</span> <span data-id="7lsKMtR|7mL8hqm|7mLg2Jx">casa</span>.</span></div><div class="c-definitions__item-footer"><div class="c-word-list"><div class="c-word-list__label"><abbr class="sin-header-inline d" title="Sin&#xF3;nimos o afines">Sin.:</abbr></div><ul class="c-word-list__items" role="list"><li><span><span class="sin" data-id="8UP1xbR">chal&#xE9;</span></span>, <span><span class="sin" data-id="8URIZPT">chalet</span></span>.</li></ul></div></div></div></li><li id="LjSIH95" class="j"><div class="c-definitions__item" role="definition"><div><span class="n_acep">3. </span><abbr class="g" title="nombre femenino">f.</abbr> <a class="a" href="/?id=TD3BxDc#CRZCLsj">piso</a> (&#x2016; <span data-id="byF4Mc7">vivienda</span>). <span class="h"><span data-id="P9rNqLB|P9tBea9|P9vG3X8">Mi</span> <span data-id="7lsKMtR|7mL8hqm|7mLg2Jx">casa</span> <span data-id="GnJiqdL">est&#xE1;</span> <span data-id="EuPaWdO">en</span> <span data-id="ESraxkH">el</span> 3.&#xBA; <span data-id="6MolVcO">C</span>.</span></div><div class="c-definitions__item-footer"><div class="c-word-list"><div class="c-word-list__label"><abbr class="sin-header-inline d" title="Sin&#xF3;nimo o af&#xED;n">Sin.:</abbr></div><ul class="c-word-list__items" role="list"><li><span><span class="sin" data-id="TD3BxDc">piso</span></span>.</li></ul></div></div></div></li><li id="LjSPhSE" class="j"><div class="c-definitions__item" role="definition"><div><span class="n_acep">4. </span><abbr class="g" title="nombre femenino">f.</abbr> <span data-id="ENa0lL9">Edificio</span>, <span data-id="PSAA1Au">mobiliario</span>, <span data-id="ViiZ39k">r&#xE9;gimen</span> <span data-id="BtDkacL|BtFYznp">de</span> <span data-id="blw7uSa">vida</span>, <abbr class="d" title="etc&#xE9;tera">etc.,</abbr> <span data-id="BtDkacL|BtFYznp">de</span> <span data-id="1oMNWvM">alguien</span>. <span class="h"><span data-id="EJtx4Yo|EK067bv">Echo</span> <span data-id="BtDkacL|BtFYznp">de</span> <span data-id="OuzZNmN">menos</span> <span data-id="ESraxkH|MiZ5vEt|NWnohQu">las</span> <span data-id="9xkcZ9b">comodidades</span> <span data-id="BtDkacL|BtFYznp">de</span> <span data-id="7lsKMtR|7mL8hqm|7mLg2Jx">casa</span>.</span></div></div></li></ol><h3 id="AezUgze" class="k5"><u>casa</u> a la malicia</h3><ol class="c-definitions"><li id="LjcofSI" class="m"><div class="c-definitions__item" role="definition"><div><span class="n_acep">1. </span><abbr class="d" title="nombre femenino">f.</abbr> <span class="u">casa</span> <span data-id="UkbUarn">que</span> <span data-id="A5cH5M4">con</span> <span data-id="6PvMEeq|6R7K0Lr|6R7OJ76">cabida</span> <span data-id="Rp1CuT2|RsVKhBv|RwYmdsn|RxSczPr">para</span> <span data-id="23Sn9bH">alojar</span> <span data-id="E1z0RhR|EA0Jc84">dos</span> <span data-id="HZnZiow">familias</span> <span data-id="XNTSeAe|XNVjCmd">se</span> <span data-id="ENXt0Vd">edificaba</span> <span data-id="EuPaWdO">en</span> Madrid <span data-id="EHqoAYN|EHsV5Ge">durante</span> <span data-id="ESraxkH">el</span> <span data-id="Xr0ACdZ">siglo</span> <span class="i2">XVII,</span> <span data-id="Y5fMg13|Y5lVqnD|Y5lmhPd">sobre</span> <span data-id="aY0DN51|aY9hlGc">traza</span> <span data-id="3dvG2xE">arquitect&#xF3;nica</span> <span data-id="EuPaWdO">en</span> <span data-id="HSa9etX|HSdPKcm|HSfC1I8">fachada</span> <span data-id="BtDkacL|BtFYznp">de</span> <span data-id="b6hEWeB|b6iKApr">un</span> <span data-id="YJBIl0A|YJBeprw">solo</span> <span data-id="TC7IycY|TD3BxDc">piso</span>, <span data-id="VlZMsEx">rehuyendo</span> <span data-id="40vmQ44|3zT41MT">as&#xED;</span> <span data-id="ESraxkH|MiZ5vEt|NWnohQu">la</span> <span data-id="7Wnhao0|7XB9iU3">carga</span> <span data-id="BtDkacL|BtFYznp">de</span> <span data-id="3GVXH2s|3GYsxvQ">aposento</span>.</div></div></li></ol><footer></footer> \ No newline at end of file