aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrob.scott <[email protected]>2015-03-10 13:57:02 +0000
committerrob.scott <[email protected]>2015-03-10 13:57:02 +0000
commit3418839d8b818485331ef7931dea1de26c751da2 (patch)
tree7dedc0b4a35e0d1d22b3b3c22210d10b31a5b7a8
parenta39082f6f49fb326111bc2a0d9014c9dc65fe1fa (diff)
downloadfaker-3418839d8b818485331ef7931dea1de26c751da2.tar.xz
faker-3418839d8b818485331ef7931dea1de26c751da2.zip
Add Commerce functions from https://github.com/stympy/faker into javascript
-rw-r--r--index.js14
-rw-r--r--lib/commerce.js81
-rw-r--r--lib/locales/en.js32
-rw-r--r--test/all.functional.js4
-rw-r--r--test/commerce.unit.js112
5 files changed, 238 insertions, 5 deletions
diff --git a/index.js b/index.js
index f3bc4291..d9a5c50e 100644
--- a/index.js
+++ b/index.js
@@ -29,6 +29,7 @@ exports.date = require('./lib/date');
exports.random = require('./lib/random');
exports.finance = require('./lib/finance');
exports.hacker = require('./lib/hacker');
+exports.commerce = require('./lib/commerce');
var locales = exports.locales = require('./lib/locales');
@@ -40,6 +41,8 @@ exports.localeFallback = "en";
exports.definitions = {};
+var _stringDefinitions = ["title", "separator"];
+
var _definitions = {
"name": ["first_name", "last_name", "prefix", "suffix"],
"address": ["city_prefix", "city_suffix", "street_suffix", "county", "country", "state", "state_abbr"],
@@ -48,9 +51,18 @@ var _definitions = {
"hacker": ["abbreviation", "adjective", "noun", "verb", "ingverb"],
"phone_number": ["formats"],
"finance": ["account_type", "transaction_type", "currency"],
- "internet": ["avatar_uri", "domain_suffix", "free_email", "password"]
+ "internet": ["avatar_uri", "domain_suffix", "free_email", "password"],
+ "commerce": ["color", "department", "product_name", "price"]
};
+_stringDefinitions.forEach(function(d) {
+ if (typeof locales[exports.locale][d] === "undefined") {
+ exports.definitions[d] = locales[exports.localeFallback][d];
+ } else {
+ exports.definitions[d] = locales[exports.locale][d];
+ }
+});
+
// Create a Getter for all definitions.foo.bar propetries
Object.keys(_definitions).forEach(function(d){
if (typeof exports.definitions[d] === "undefined") {
diff --git a/lib/commerce.js b/lib/commerce.js
new file mode 100644
index 00000000..20b736bc
--- /dev/null
+++ b/lib/commerce.js
@@ -0,0 +1,81 @@
+var faker = require('../index');
+
+var commerce = {
+
+ color: function() {
+ return faker.random.array_element(faker.definitions.commerce.color);
+ },
+
+ department: function(max, fixedAmount) {
+ max = max || 3;
+
+ var num = Math.floor((Math.random() * max) + 1);
+ if(fixedAmount) {
+ num = max;
+ }
+
+ var categories = faker.commerce.categories(num);
+
+ console.log("NUMBER: " + num);
+
+ if(num > 1) {
+ return faker.commerce.mergeCategories(categories);
+ }
+
+ return categories[0];
+ },
+
+ productName: function() {
+ return faker.commerce.productAdjective() + " " +
+ faker.commerce.productMaterial() + " " +
+ faker.commerce.product();
+ },
+
+ price: function(min, max, dec, symbol) {
+ min = min || 0;
+ max = max || 1000;
+ dec = dec || 2;
+ symbol = symbol || '';
+
+ if(min < 0 || max < 0) {
+ return symbol + 0.00;
+ }
+
+ return symbol + (Math.round((Math.random() * (max - min) + min) * Math.pow(10, dec)) / Math.pow(10, dec)).toFixed(dec);
+ },
+
+ categories: function(num) {
+ var categories = [];
+
+ do {
+ var category = faker.random.array_element(faker.definitions.commerce.department);
+ if(categories.indexOf(category) === -1) {
+ categories.push(category);
+ }
+ } while(categories.length < num);
+
+ return categories;
+ },
+
+ mergeCategories: function(categories) {
+ var separator = faker.definitions.separator;
+ var commaSeparated = categories.slice(0, -1).join(', ');
+
+ return [commaSeparated, categories[categories.length - 1]].join(separator);
+ },
+
+ productAdjective: function() {
+ return faker.random.array_element(faker.definitions.commerce.product_name.adjective);
+ },
+
+ productMaterial: function() {
+ return faker.random.array_element(faker.definitions.commerce.product_name.material);
+ },
+
+ product: function() {
+ return faker.random.array_element(faker.definitions.commerce.product_name.product);
+ }
+
+};
+
+module.exports = commerce; \ No newline at end of file
diff --git a/lib/locales/en.js b/lib/locales/en.js
index d79cb828..a7d70e8f 100644
--- a/lib/locales/en.js
+++ b/lib/locales/en.js
@@ -7723,7 +7723,14 @@ en.commerce = {
"Fantastic",
"Practical",
"Sleek",
- "Awesome"
+ "Awesome",
+ "Generic",
+ "Handcrafted",
+ "Handmade",
+ "Licensed",
+ "Refined",
+ "Unbranded",
+ "Tasty"
],
"material": [
"Steel",
@@ -7732,18 +7739,37 @@ en.commerce = {
"Plastic",
"Cotton",
"Granite",
- "Rubber"
+ "Rubber",
+ "Metal",
+ "Soft",
+ "Fresh",
+ "Frozen",
],
"product": [
"Chair",
"Car",
"Computer",
+ "Keyboard",
+ "Mouse",
+ "Bike",
+ "Ball",
"Gloves",
"Pants",
"Shirt",
"Table",
"Shoes",
- "Hat"
+ "Hat",
+ "Towels",
+ "Soap",
+ "Tuna",
+ "Chicken",
+ "Fish",
+ "Cheese",
+ "Bacon",
+ "Pizza",
+ "Salad",
+ "Sausages",
+ "Chips"
]
}
};
diff --git a/test/all.functional.js b/test/all.functional.js
index 1a2e836a..966987e3 100644
--- a/test/all.functional.js
+++ b/test/all.functional.js
@@ -22,7 +22,9 @@ var modules = {
phone: ['phoneNumber'],
- finance: ['account', 'accountName', 'mask', 'amount', 'transactionType', 'currencyCode', 'currencyName', 'currencySymbol']
+ finance: ['account', 'accountName', 'mask', 'amount', 'transactionType', 'currencyCode', 'currencyName', 'currencySymbol'],
+
+ commerce: ['color', 'department', 'productName', 'price']
};
describe("functional tests", function () {
diff --git a/test/commerce.unit.js b/test/commerce.unit.js
new file mode 100644
index 00000000..856c3be6
--- /dev/null
+++ b/test/commerce.unit.js
@@ -0,0 +1,112 @@
+if(typeof module !== 'undefined') {
+ var assert = require('assert'),
+ sinon = require('sinon'),
+ faker = require('../index');
+}
+
+describe("commerce.js", function() {
+
+ describe("color()", function() {
+ it("returns random value from commerce.color array", function() {
+ var color = faker.commerce.color();
+ assert.ok(faker.definitions.commerce.color.indexOf(color) !== -1);
+ });
+ });
+
+ describe("department(max, fixedValue)", function() {
+ it("should use the default amounts when not passing arguments", function() {
+ var department = faker.commerce.department();
+
+ assert.ok(department.split(" ").length <= 4);
+ });
+
+ it("should return only one value if we specify a maximum of one", function() {
+ sinon.spy(faker.random, 'array_element');
+
+ var department = faker.commerce.department(1);
+
+ assert.strictEqual(department.split(" ").length, 1);
+ assert.ok(faker.random.array_element.calledOnce);
+
+ faker.random.array_element.restore();
+ });
+
+ it("should return the maxiumum value if we specify the fixed value", function() {
+ sinon.spy(faker.random, 'array_element');
+
+ var department = faker.commerce.department(5, true);
+
+ console.log(department);
+
+ // account for the separator
+ assert.strictEqual(department.split(" ").length, 6);
+ // Sometimes it will generate duplicates that aren't used in the final string,
+ // so we check if array_element has been called exactly or more than 5 times
+ assert.ok(faker.random.array_element.callCount >= 5);
+
+ faker.random.array_element.restore();
+ })
+ });
+
+ describe("productName()", function() {
+ it("returns name comprising of an adjective, material and product", function() {
+ sinon.spy(faker.random, 'array_element');
+ sinon.spy(faker.commerce, 'productAdjective');
+ sinon.spy(faker.commerce, 'productMaterial');
+ sinon.spy(faker.commerce, 'product');
+ var name = faker.commerce.productName();
+
+ assert.ok(name.split(' ').length >= 3);
+ assert.ok(faker.random.array_element.calledThrice);
+ assert.ok(faker.commerce.productAdjective.calledOnce);
+ assert.ok(faker.commerce.productMaterial.calledOnce);
+ assert.ok(faker.commerce.product.calledOnce);
+
+ faker.random.array_element.restore();
+ faker.commerce.productAdjective.restore();
+ faker.commerce.productMaterial.restore();
+ faker.commerce.product.restore();
+ });
+ });
+
+ describe("price(min, max, dec, symbol", function() {
+ it("should use the default amounts when not passing arguments", function() {
+ var price = faker.commerce.price();
+
+ assert.ok(price);
+ assert.equal((price > 0), true, "the amount should be greater than 0");
+ assert.equal((price < 1001), true, "the amount should be less than 1000");
+ });
+
+ it("should use the default decimal location when not passing arguments", function() {
+ var price = faker.commerce.price();
+
+ var decimal = ".";
+ var expected = price.length - 3;
+ var actual = price.indexOf(decimal);
+
+ assert.equal(actual, expected, "The expected location of the decimal is " + expected + " but it was " + actual + " amount " + price);
+ });
+
+ it("should not include a currency symbol by default", function () {
+
+ var amount = faker.commerce.price();
+
+ var regexp = new RegExp(/[0-9.]/);
+
+ var expected = true;
+ var actual = regexp.test(amount);
+
+ assert.equal(actual, expected, 'The expected match should not include a currency symbol');
+ });
+
+ it("it should handle negative amounts, but return 0", function () {
+
+ var amount = faker.commerce.price(-200, -1);
+
+ assert.ok(amount);
+ assert.equal((amount == 0.00), true, "the amount should equal 0");
+ });
+ });
+
+}); \ No newline at end of file