Skip to content
This repository has been archived by the owner on Aug 11, 2022. It is now read-only.

Commit

Permalink
fixed regex colors and added test to ensure it stays fixed
Browse files Browse the repository at this point in the history
  • Loading branch information
chrismeyersfsu authored and othiym23 committed Oct 4, 2014
1 parent 33ba2d5 commit 3bff494
Show file tree
Hide file tree
Showing 2 changed files with 266 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/search.js
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ function addColorMarker (str, arg, i) {

if (arg.charAt(0) === "/") {
//arg = arg.replace(/\/$/, "")
return str.replace( new RegExp(arg.substr(1, arg.length - 1), "gi")
return str.replace( new RegExp(arg.substr(1, arg.length - 2), "gi")
, function (bit) { return markStart + bit + markEnd } )

}
Expand Down
265 changes: 265 additions & 0 deletions test/tap/search.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,265 @@
var common = require("../common-tap.js")
var test = require("tap").test
var rimraf = require("rimraf")
var mr = require("npm-registry-mock")
var fs = require("fs")
var path = require("path")
var pkg = path.resolve(__dirname, "search")
var cache = path.resolve(pkg, "cache")
var registryCache = path.resolve(cache, "localhost_1337", "-", "all")
var cacheJsonFile = path.resolve(registryCache, ".cache.json")
var mkdirp = require("mkdirp")

var timeMock = {
epoch: 1411727900,
future: 1411727900+100,
all: 1411727900+25,
since: 0 // filled by since server callback
}

var EXEC_OPTS = {}

function cleanupCache() {
rimraf.sync(cache)
}
function cleanup () { cleanupCache() }

function setupCache() {
mkdirp.sync(cache)
mkdirp.sync(registryCache)
var res = fs.writeFileSync(cacheJsonFile, stringifyUpdated(timeMock.epoch))
if (res) throw new Error("Creating cache file failed")
}

var mocks = {
/* Since request, always response with an _update time > the time requested */
sinceFuture: function(server) {
server.filteringPathRegEx(/startkey=[^&]*/g, function(s) {
var _allMock = JSON.parse(JSON.stringify(allMock))
timeMock.since = _allMock._updated = s.replace("startkey=", "")
server.get("/-/all/since?stale=update_after&" + s)
.reply(200, _allMock)
return s
})
},
allFutureUpdatedOnly: function(server) {
server.get("/-/all")
.reply(200, stringifyUpdated(timeMock.future))
},
all: function(server) {
server.get("/-/all")
.reply(200, allMock)
}
}


test("No previous cache, init cache triggered by first search", function(t) {
cleanupCache()

mr({ port: common.port, mocks: mocks.allFutureUpdatedOnly }, function (s) {
common.npm([
"search", "do not do extra search work on my behalf",
"--registry", common.registry,
"--cache", cache,
"--loglevel", "silent",
"--color", "always"
],
EXEC_OPTS,
function(err, code) {
s.close()
t.equal(code, 0, "search finished successfully")
t.ifErr(err, "search finished successfully")

t.ok(fs.existsSync(cacheJsonFile),
cacheJsonFile + " expected to have been created")
var cacheData = JSON.parse(fs.readFileSync(cacheJsonFile, "utf8"))
t.equal(cacheData._updated, String(timeMock.future))
t.end()
})
})
})

test("previous cache, _updated set, should trigger since request", function(t) {
cleanupCache()
setupCache()

function m(server) {
[ mocks.all, mocks.sinceFuture ].forEach(function(m) {
m(server)
})
}
mr({ port: common.port, mocks: m }, function (s) {
common.npm([
"search", "do not do extra search work on my behalf",
"--registry", common.registry,
"--cache", cache,
"--loglevel", "silly",
"--color", "always"
],
EXEC_OPTS,
function(err, code) {
s.close()
t.equal(code, 0, "search finished successfully")
t.ifErr(err, "search finished successfully")

var cacheData = JSON.parse(fs.readFileSync(cacheJsonFile, "utf8"))
t.equal(cacheData._updated,
timeMock.since,
"cache update time gotten from since response")
cleanupCache()
t.end()
})
})
})


var searches = [
{
term: "f36b6a6123da50959741e2ce4d634f96ec668c56",
description: "non-regex",
location: 241
},
{
term: "/f36b6a6123da50959741e2ce4d634f96ec668c56/",
description: "regex",
location: 241
}
]

searches.forEach(function(search) {
test(search.description + " search in color", function(t) {
cleanupCache()
mr({ port: common.port, mocks: mocks.all }, function (s) {
common.npm([
"search", search.term,
"--registry", common.registry,
"--cache", cache,
"--loglevel", "silent",
"--color", "always"
],
EXEC_OPTS,
function(err, code, stdout) {
s.close()
t.equal(code, 0, "search finished successfully")
t.ifErr(err, "search finished successfully")
// \033 == \u001B
var markStart = "\u001B\\[[0-9][0-9]m"
var markEnd = "\u001B\\[0m"

var re = new RegExp(markStart + ".*?" + markEnd)

var cnt = stdout.search(re)
t.equal(cnt, search.location,
search.description + " search for " + search.term)
t.end()
})
})
})
})

test("cleanup", function (t) {
cleanup()
t.end()
})

function stringifyUpdated(time) {
return JSON.stringify({ _updated : String(time) })
}

var allMock = {
"_updated": timeMock.all,
"generator-frontcow": {
"name": "generator-frontcow",
"description": "f36b6a6123da50959741e2ce4d634f96ec668c56 This is a fake description to ensure we do not accidentally search the real npm registry or use some kind of cache",
"dist-tags": {
"latest": "0.1.19"
},
"maintainers": [
{
"name": "bcabanes",
"email": "contact@benjamincabanes.com"
}
],
"homepage": "https://github.com/bcabanes/generator-frontcow",
"keywords": [
"sass",
"frontend",
"yeoman-generator",
"atomic",
"design",
"sass",
"foundation",
"foundation5",
"atomic design",
"bourbon",
"polyfill",
"font awesome"
],
"repository": {
"type": "git",
"url": "https://github.com/bcabanes/generator-frontcow"
},
"author": {
"name": "ben",
"email": "contact@benjamincabanes.com",
"url": "https://github.com/bcabanes"
},
"bugs": {
"url": "https://github.com/bcabanes/generator-frontcow/issues"
},
"license": "MIT",
"readmeFilename": "README.md",
"time": {
"modified": "2014-10-03T02:26:18.406Z"
},
"versions": {
"0.1.19": "latest"
}
},
"marko": {
"name": "marko",
"description": "Marko is an extensible, streaming, asynchronous, high performance, HTML-based templating language that can be used in Node.js or in the browser.",
"dist-tags": {
"latest": "1.2.16"
},
"maintainers": [
{
"name": "pnidem",
"email": "pnidem@gmail.com"
},
{
"name": "philidem",
"email": "phillip.idem@gmail.com"
}
],
"homepage": "https://github.com/raptorjs/marko",
"keywords": [
"templating",
"template",
"async",
"streaming"
],
"repository": {
"type": "git",
"url": "https://github.com/raptorjs/marko.git"
},
"author": {
"name": "Patrick Steele-Idem",
"email": "pnidem@gmail.com"
},
"bugs": {
"url": "https://github.com/raptorjs/marko/issues"
},
"license": "Apache License v2.0",
"readmeFilename": "README.md",
"users": {
"pnidem": true
},
"time": {
"modified": "2014-10-03T02:27:31.775Z"
},
"versions": {
"1.2.16": "latest"
}
}
}

0 comments on commit 3bff494

Please sign in to comment.