summaryrefslogtreecommitdiff
path: root/js/test/main.js
blob: 66c715ba6a931273b4b041c9a0e292aa18f4944a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
  @licstart  The following is the entire license notice for the
  JavaScript code in this page.

  Copyright (C) 2018 Taler Systems SA.

  The JavaScript code in this page is free software: you can
  redistribute it and/or modify it under the terms of the GNU
  Lesser General Public License (GNU LGPL) as published by the
  Free Software Foundation, either version 2.1 of the License,
  or (at your option) any later version.  The code is distributed
  WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  LGPL for more details.

  As additional permission under GNU LGPL version 2.1 section 7,
  you may distribute non-source (e.g., minimized or compacted)
  forms of that code without the copy of the GNU LGPL normally
  required by section 4, provided you include this license notice
  and a URL through which recipients can access the Corresponding
  Source.

  @licend  The above is the entire license notice for the
  JavaScript code in this page.

  @author Marcello Stanisci
*/

const ava = require("ava");
const sinon = require("sinon");
const swig = require("swig");
const jsdom = require("jsdom");
const xpath = require("xpath");
const pd = require("pretty-data");

ava.test.beforeEach(t => {

  function xhr_mock() {
    t.context.xhr = sinon.useFakeXMLHttpRequest();
    t.context.requests = [];
    t.context.xhr.onCreate = function(xhr){
      t.context.requests.push(xhr);};
    global.XMLHttpRequest = t.context.xhr;};

  function document_mock() {
    var template = swig.compileFile(
      __dirname + "/" + "../../" +
      "talerbackoffice/backoffice/" +
      "templates/backoffice.html");
    var html = template({instances: ["mock-instance"]});
    var dom = new jsdom.JSDOM(html);
    dom.window.document.addEventListener = function(){};
    global.document = dom.window.document;};

  function minor_mocks() {
    global.alert = console.log;
    global.XPathResult = xpath.XPathResult;
    // disable logging for tests
    global.console.log = function(){};
  };

  xhr_mock();
  document_mock();
  minor_mocks();

  t.context.bo = require("../backoffice");
});

ava.test.afterEach(t => {
  delete global.XMLHttpRequest;
  delete global.document;
  delete global.alert;
  delete t.context.xhr;
  delete t.context.requests;
  var bo_handle = require.resolve("../backoffice");
  delete require.cache[bo_handle];
});

ava.test("Tracking a wire transfer", (t) => {
  /**
   * This test case checks whether the popup where
   * the user clicked to track a wire transfer got
   * closed; then it checks that the 'table' of the
   * orders associated with this wire transfer got
   * correctly filled.
   */

  var mock_tracks = {
    deposits_sums: ["mock-tracks"],
    execution_time: "/Date(0)/"};

  sinon.stub(t.context.bo, "close_popup"); 
  sinon.stub(t.context.bo, "fill_table"); 
  t.context.bo.track_transfer("http://exchange.mock/", "mock-wtid");
  t.context.requests[0].respond(200, "application/json",
                                JSON.stringify(mock_tracks));
  sinon.assert.calledOnce(t.context.bo.close_popup);
  sinon.assert.calledWith(t.context.bo.fill_table,
                          ["mock-tracks"],
                          "/Date(0)/",
                          "mock-wtid");
});

ava.test("Tracking order id", t => {

  /**
   * This test case checks whether the 'overlay' element in the
   * page contains the expected tracks and it is made visible.
   */

  t.context.bo.track_order(22);

  // mocking a "/track/transaction" response from the backend
  var mock_tracks = [
    {wtid: "mock wtid",
     exchange_url: "http://exchange.mock/",
     amount: {value: 2, fraction: 0, currency: "MOCK"},
     execution_time: "mock /Date(0)/"}];

  t.context.requests[0].respond
    (200, "application/json",
     JSON.stringify(mock_tracks));

  var overlay = document.getElementById("popup1");
  t.true(overlay.style.visibility == "visible");

  var rendered_tracks = document.evaluate
    ("div/div/table/tbody/tr[2]",
     overlay,
     null,
     XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
     null).snapshotItem(0);
  var expected_html =
    "<tr>" +
      "<td class=\"wtid\">" +
        "<a onclick=\"track_transfer('http://exchange.mock/', " +
                                    "'mock wtid')\" " +
           "href=\"#0\">mock wtid http://exc...</a>" +
      "</td>" +
      "<td class=\"amount\">2.00 MOCK</td>" +
      "<td class=\"date\">1 Jan 1970, 01:00</td>" +
      "</tr>";

  t.true(pd.pd.xmlmin(rendered_tracks.outerHTML) == expected_html);
});

ava.test("Order id not found", (t) => {
  /**
   * FIXME: improve the reaction to a order id not found.
   * Alerting a message is not acceptable.
   */
  var alert = sinon.spy(global, "alert");
  t.context.bo.track_order(22);
  t.context.requests[0].respond(404);
  sinon.assert.calledWith(alert, "Order ID unknown");
  t.pass();
});