HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/buyercall/node_modules/underscore-template-loader/test/macroTest.js
var fs = require('fs');
var path = require('path');
var chai = require('chai');
var assert = chai.assert;
chai.use(require('chai-string'));

var loader = require('../');
var WebpackLoaderMock = require('./lib/WebpackLoaderMock');
var loadTemplate = require('./lib/loadTemplate');
var loadOutput = require('./lib/loadOutput');
var toText = require('./lib/toText.js');

function testTemplate(loader, template, options, testFn) {
  loader.call(new WebpackLoaderMock({
    query: options.query || '?',
    resource: path.join(__dirname, 'templates', template),
    options: options.options,
    async: function (err, source) {
      testFn(source);
    }
  }), loadTemplate(template));
}

describe('macro', function () {
  it('should be parsed', function (done) {
    testTemplate(loader, 'custom-macro.html', {
      options: {
        macros: {
          foo: function () {
            return '"<p>bar</p>"';
          }
        }
      }
    }, function (output) {
      assert.equal(output, loadOutput('custom-macro.txt'));
      done();
    });
  });

  it('should receive boolean arguments', function (done) {
    testTemplate(loader, 'macro_boolean_args.html', {
      options: {
        macros: {
          bool_test: function (arg) {
            assert.typeOf(arg, 'boolean');
            return arg ? '"<p>TRUE</p>"' : '"<p>FALSE</p>"';
          }
        }
      }
    }, function (output) {
      assert.equal(output, loadOutput('macro_boolean_args.txt'));
      done();
    });
  });

  it('should receive numeric arguments', function (done) {
    testTemplate(loader, 'macro_numeric_args.html', {
      options: {
        macros: {
          num_test: function (arg) {
            assert.typeOf(arg, 'number');
            return '"<p>' + arg + '</p>"';
          }
        }
      }
    }, function (output) {
      assert.equal(output, loadOutput('macro_numeric_args.txt'));
      done();
    });
  });

  it('should receive string arguments', function (done) {
    testTemplate(loader, 'macro_string_args.html', {
      options: {
        macros: {
          str_test: function (arg) {
            assert.typeOf(arg, 'string');
            return '"<p>' + arg.toUpperCase() + '</p>"';
          }
        }
      }
    }, function (output) {
      assert.equal(output, loadOutput('macro_string_args.txt'));
      done();
    });
  });

  it('should receive object arguments', function(done) {
    testTemplate(loader, 'macro_object_args.html', {
      options: {
        macros: {
          object_test: function(arg) {
            assert.typeOf(arg, 'object');
            return '"' + toText(arg) + '"';
          }
        }
      }
    }, function(output) {
      assert.equal(output.trimRight(), loadOutput('macro_object_args.txt').trimRight());
      done();
    });
  });

  it('should receive argument list', function (done) {
    testTemplate(loader, 'macro_argument_list.html', {
      options: {
        macros: {
          numbers: function (first, second, third) {
            assert.typeOf(first, 'number');
            assert.typeOf(second, 'number');
            assert.typeOf(third, 'number');

            var output = '';
            for (var i = 0; i < arguments.length; i++) {
              output += '<p>' + arguments[i] + '</p>';
            }
            return '"' + output + '"';
          },

          booleans: function (first, second, third) {
            assert.typeOf(first, 'boolean');
            assert.typeOf(second, 'boolean');
            assert.typeOf(third, 'boolean');

            var output = '';
            for (var i = 0; i < arguments.length; i++) {
              output += '<p>' + (arguments[i] ? 'TRUE' : 'FALSE') + '</p>';
            }
            return '"' + output + '"';
          },

          strings: function (first, second, third) {
            assert.typeOf(first, 'string');
            assert.typeOf(second, 'string');
            assert.typeOf(third, 'string');

            var output = '';
            for (var i = 0; i < arguments.length; i++) {
              output += '<p>' + arguments[i].toLowerCase().replace(/"/g, "\\\"") + '</p>';
            }
            return '"' + output + '"';
          },

          mixed: function () {
            assert.equal(arguments.length, 6);
            assert.typeOf(arguments[0], 'boolean');
            assert.typeOf(arguments[1], 'number');
            assert.typeOf(arguments[2], 'string');
            assert.typeOf(arguments[3], 'boolean');
            assert.typeOf(arguments[4], 'string');
            assert.typeOf(arguments[5], 'number');

            var output = '';

            for (var i = 0; i < arguments.length; i++) {
              var type = typeof(arguments[i]);

              if (type == 'string') {
                output += '<p>' + arguments[i].toLowerCase().replace(/"/g, "\\\"") + '</p>';
              } else if (type == 'number') {
                output += '<p>' + arguments[i] + '</p>';
              } else if (type == 'boolean') {
                output += '<p>' + (arguments[i] ? 'TRUE' : 'FALSE') + '</p>';
              }
            }

            return '"' + output + '"';

          }
        }
      }
    }, function (output) {
      assert.equal(output, loadOutput('macro_argument_list.txt'));
      done();
    });
  });

  it('should not be evaluated', function (done) {
    testTemplate(loader, 'macro.html', {
      query: {
        parseMacros: false
      }
    }, function (output) {
      assert.equal(output, loadOutput('disabled-macro.txt'));
      done();
    });
  });

  it('should be replaced when escaped', function (done) {
    testTemplate(loader, 'macro_escaped.html', {
      options: {
        macros: {
          unescaped: function () {
            return '"<p>Ok</p>"';
          }
        }
      }
    }, function (output) {
      assert.equal(output, loadOutput('macro_escaped.txt'));
      done();
    });
  });

  it('support macros in query', function (done) {
    testTemplate(loader, 'macro_in_query.html', {
      query: {
        macros: {
          testquery: function () {
            return '"Ok"';
          }
        }
      }
    }, function (output) {
      assert.equal(output, loadOutput('macro_in_query.txt'));
      done();
    });
  });
});