2014-11-04 16:07:32 +01:00
var should = require ( "should" ) ;
var sinon = require ( 'sinon' ) ;
2015-05-10 20:27:35 +02:00
//var fs = require("fs");
2018-05-01 18:33:05 +02:00
var helper = require ( "node-red-node-test-helper" ) ;
2015-03-25 09:44:37 +01:00
var exifNode = require ( '../../../utility/exif/94-exif.js' ) ;
2014-11-04 16:07:32 +01:00
describe ( 'exif node' , function ( ) {
2015-02-05 14:52:20 +01:00
"use strict" ;
2014-11-04 16:07:32 +01:00
beforeEach ( function ( done ) {
helper . startServer ( done ) ;
} ) ;
afterEach ( function ( done ) {
2015-05-10 20:27:35 +02:00
helper . unload ( ) . then ( function ( ) {
helper . stopServer ( done ) ;
} ) ;
2014-11-04 16:07:32 +01:00
} ) ;
it ( 'extracts location data from Exif data of JPEG' , function ( done ) {
var exif = require ( 'exif' ) ;
var ExifImage = exif . ExifImage ;
// the jpg file is a single black dot but it was originally a photo taken at IBM Hursley
2015-03-31 14:18:25 +02:00
//console.log(process.cwd());
2015-05-10 20:27:35 +02:00
//var data = fs.readFileSync("test/utility/exif/exif_test_image.jpg", null); // extracting genuine exif data to be fed back as the result of the stubbed ExifImage constructor
2015-03-31 14:18:25 +02:00
//var data = fs.readFileSync("exif_test_image.jpg", null); // extracting genuine exif data to be fed back as the result of the stubbed ExifImage constructor
var flow = [ { id : "exifNode1" , type : "exif" , wires : [ [ "helperNode1" ] ] } ,
{ id : "helperNode1" , type : "helper" } ] ;
2015-02-05 14:52:20 +01:00
2015-05-10 20:27:35 +02:00
var gpsmsg = { gps : { GPSLatitudeRef : 'N' ,
GPSLatitude : [ 50 , 57 , 22.4697 ] ,
GPSLongitudeRef : 'W' ,
GPSLongitude : [ 1 , 22 , 1.2467 ] ,
GPSAltitudeRef : 0 ,
GPSAltitude : 50 ,
GPSTimeStamp : [ 7 , 32 , 2 ] ,
GPSImgDirectionRef : 'M' ,
GPSImgDirection : 267 ,
GPSProcessingMethod : 'ASCII\u0000\u0000\u0000FUSED' ,
GPSDateStamp : '2014:06:10' }
} ;
2018-05-02 14:53:04 +02:00
var spy = sinon . stub ( exif , 'ExifImage' ) . callsFake ( function ( arg1 , arg2 ) { arg2 ( null , gpsmsg ) ; } ) ;
2015-05-10 20:27:35 +02:00
2015-03-31 14:18:25 +02:00
helper . load ( exifNode , flow , function ( ) {
var exifNode1 = helper . getNode ( "exifNode1" ) ;
var helperNode1 = helper . getNode ( "helperNode1" ) ;
2015-02-05 14:52:20 +01:00
2015-03-31 14:18:25 +02:00
helperNode1 . on ( "input" , function ( msg ) {
msg . location . lat . should . equal ( 50.95624 ) ; // this data is stored in the jpg file
msg . location . lon . should . equal ( - 1.36701 ) ;
2015-05-10 20:27:35 +02:00
exif . ExifImage . restore ( ) ;
2015-03-31 14:18:25 +02:00
done ( ) ;
} ) ;
2017-06-24 14:53:22 +02:00
exifNode1 . receive ( { payload : new Buffer . from ( "hello" ) } ) ;
2015-05-10 20:27:35 +02:00
} ) ;
} ) ;
it ( 'extracts location data in Southern and Eastern hemispheres' , function ( done ) {
var exif = require ( 'exif' ) ;
var ExifImage = exif . ExifImage ;
// the jpg file is a single black dot but it was originally a photo taken at IBM Hursley
//console.log(process.cwd());
//var data = fs.readFileSync("test/utility/exif/exif_test_image.jpg", null); // extracting genuine exif data to be fed back as the result of the stubbed ExifImage constructor
//var data = fs.readFileSync("exif_test_image.jpg", null); // extracting genuine exif data to be fed back as the result of the stubbed ExifImage constructor
var flow = [ { id : "exifNode1" , type : "exif" , wires : [ [ "helperNode1" ] ] } ,
{ id : "helperNode1" , type : "helper" } ] ;
var gpsmsg = { gps : { GPSLatitudeRef : 'S' ,
GPSLatitude : [ 50 , 57 , 22.4697 ] ,
GPSLongitudeRef : 'E' ,
GPSLongitude : [ 1 , 22 , 1.2467 ] ,
GPSTimeStamp : [ 7 , 32 , 2 ] ,
GPSImgDirectionRef : 'M' ,
GPSImgDirection : 267 ,
GPSProcessingMethod : 'ASCII\u0000\u0000\u0000FUSED' ,
GPSDateStamp : '2014:06:10' }
} ;
2018-05-02 14:53:04 +02:00
var spy = sinon . stub ( exif , 'ExifImage' ) . callsFake ( function ( arg1 , arg2 ) { arg2 ( null , gpsmsg ) ; } ) ;
2015-05-10 20:27:35 +02:00
helper . load ( exifNode , flow , function ( ) {
var exifNode1 = helper . getNode ( "exifNode1" ) ;
var helperNode1 = helper . getNode ( "helperNode1" ) ;
helperNode1 . on ( "input" , function ( msg ) {
msg . location . lat . should . equal ( - 50.95624 ) ; // this data is stored in the jpg file
msg . location . lon . should . equal ( 1.36701 ) ;
exif . ExifImage . restore ( ) ;
done ( ) ;
} ) ;
2017-06-24 14:53:22 +02:00
exifNode1 . receive ( { payload : new Buffer . from ( "hello" ) } ) ;
2015-03-31 14:18:25 +02:00
} ) ;
} ) ;
2015-02-05 14:52:20 +01:00
2015-03-31 14:18:25 +02:00
it ( 'should report if not a jpeg' , function ( done ) {
var exif = require ( 'exif' ) ;
var ExifImage = exif . ExifImage ;
2015-05-10 20:27:35 +02:00
// this time just use a buffer that isn't an jpeg image
2017-06-24 14:53:22 +02:00
var data = new Buffer . from ( "hello" ) ;
2015-03-31 14:18:25 +02:00
var eD ;
var flow = [ { id : "exifNode1" , type : "exif" , wires : [ [ "helperNode1" ] ] } ,
{ id : "helperNode1" , type : "helper" } ] ;
helper . load ( exifNode , flow , function ( ) {
var exifNode1 = helper . getNode ( "exifNode1" ) ;
var helperNode1 = helper . getNode ( "helperNode1" ) ;
setTimeout ( function ( ) {
var logEvents = helper . log ( ) . args . filter ( function ( evt ) {
return evt [ 0 ] . type == "exif" ;
2014-11-04 16:07:32 +01:00
} ) ;
2015-03-31 14:18:25 +02:00
logEvents . should . have . length ( 1 ) ;
logEvents [ 0 ] [ 0 ] . should . have . a . property ( 'msg' ) ;
logEvents [ 0 ] [ 0 ] . msg . toString ( ) . should . startWith ( "Error: The given image is not a JPEG" ) ;
done ( ) ;
} , 150 ) ;
2015-02-05 14:52:20 +01:00
2015-03-31 14:18:25 +02:00
exifNode1 . receive ( { payload : data } ) ;
2014-11-04 16:07:32 +01:00
} ) ;
2015-03-31 14:18:25 +02:00
} ) ;
it ( 'should report if bad payload' , function ( done ) {
var exif = require ( 'exif' ) ;
var ExifImage = exif . ExifImage ;
var data = "hello" ;
var eD ;
var flow = [ { id : "exifNode1" , type : "exif" , wires : [ [ "helperNode1" ] ] } ,
{ id : "helperNode1" , type : "helper" } ] ;
2015-02-05 14:52:20 +01:00
2015-03-31 14:18:25 +02:00
helper . load ( exifNode , flow , function ( ) {
var exifNode1 = helper . getNode ( "exifNode1" ) ;
var helperNode1 = helper . getNode ( "helperNode1" ) ;
setTimeout ( function ( ) {
var logEvents = helper . log ( ) . args . filter ( function ( evt ) {
return evt [ 0 ] . type == "exif" ;
} ) ;
logEvents . should . have . length ( 1 ) ;
logEvents [ 0 ] [ 0 ] . should . have . a . property ( 'msg' ) ;
logEvents [ 0 ] [ 0 ] . msg . toString ( ) . should . startWith ( "Invalid payload received, " ) ;
done ( ) ;
} , 150 ) ;
exifNode1 . receive ( { payload : data } ) ;
} ) ;
} ) ;
it ( 'should report if no payload' , function ( done ) {
var exif = require ( 'exif' ) ;
var ExifImage = exif . ExifImage ;
2017-06-24 14:53:22 +02:00
var data = new Buffer . from ( "hello" ) ;
2015-03-31 14:18:25 +02:00
var eD ;
var flow = [ { id : "exifNode1" , type : "exif" , wires : [ [ "helperNode1" ] ] } ,
{ id : "helperNode1" , type : "helper" } ] ;
helper . load ( exifNode , flow , function ( ) {
var exifNode1 = helper . getNode ( "exifNode1" ) ;
var helperNode1 = helper . getNode ( "helperNode1" ) ;
setTimeout ( function ( ) {
var logEvents = helper . log ( ) . args . filter ( function ( evt ) {
return evt [ 0 ] . type == "exif" ;
} ) ;
logEvents . should . have . length ( 1 ) ;
logEvents [ 0 ] [ 0 ] . should . have . a . property ( 'msg' ) ;
logEvents [ 0 ] [ 0 ] . msg . toString ( ) . should . startWith ( "No payload received, " ) ;
done ( ) ;
} , 150 ) ;
exifNode1 . receive ( { topic : data } ) ;
} ) ;
2014-11-04 16:07:32 +01:00
} ) ;
2015-05-10 20:27:35 +02:00
it ( 'should report if bad latitude' , function ( done ) {
var exif = require ( 'exif' ) ;
var ExifImage = exif . ExifImage ;
2017-06-24 14:53:22 +02:00
var data = new Buffer . from ( "hello" ) ;
2015-05-10 20:27:35 +02:00
var eD ;
var flow = [ { id : "exifNode1" , type : "exif" , wires : [ [ "helperNode1" ] ] } ,
{ id : "helperNode1" , type : "helper" } ] ;
var gpsmsg = { gps : { GPSLatitudeRef : 'N' ,
GPSLatitude : [ 50 , 57 ] ,
GPSLongitudeRef : 'W' ,
GPSLongitude : [ 1 , 22 , 1.2467 ] ,
GPSAltitudeRef : 0 ,
GPSAltitude : 50 ,
GPSTimeStamp : [ 7 , 32 , 2 ] }
} ;
2018-05-02 14:53:04 +02:00
var spy = sinon . stub ( exif , 'ExifImage' ) . callsFake (
2015-05-10 20:27:35 +02:00
function ( arg1 , arg2 ) {
arg2 ( null , gpsmsg ) ;
} ) ;
helper . load ( exifNode , flow , function ( ) {
var exifNode1 = helper . getNode ( "exifNode1" ) ;
var helperNode1 = helper . getNode ( "helperNode1" ) ;
setTimeout ( function ( ) {
var logEvents = helper . log ( ) . args . filter ( function ( evt ) {
return evt [ 0 ] . type == "exif" ;
} ) ;
logEvents . should . have . length ( 1 ) ;
logEvents [ 0 ] [ 0 ] . should . have . a . property ( 'msg' ) ;
logEvents [ 0 ] [ 0 ] . msg . toString ( ) . should . startWith ( "Invalid latitude data," ) ;
exif . ExifImage . restore ( ) ;
done ( ) ;
} , 150 ) ;
exifNode1 . receive ( { payload : data } ) ;
} ) ;
} ) ;
it ( 'should report if bad longitude' , function ( done ) {
var exif = require ( 'exif' ) ;
var ExifImage = exif . ExifImage ;
2017-06-24 14:53:22 +02:00
var data = new Buffer . from ( "hello" ) ;
2015-05-10 20:27:35 +02:00
var eD ;
var flow = [ { id : "exifNode1" , type : "exif" , wires : [ [ "helperNode1" ] ] } ,
{ id : "helperNode1" , type : "helper" } ] ;
var gpsmsg = { gps : { GPSLatitudeRef : 'N' ,
GPSLatitude : [ 50 , 57 , 1.3 ] ,
GPSLongitudeRef : 'W' ,
GPSLongitude : [ 1 , 22 ] ,
GPSAltitudeRef : 0 ,
GPSAltitude : 50 ,
GPSTimeStamp : [ 7 , 32 , 2 ] }
} ;
2018-05-02 14:53:04 +02:00
var spy = sinon . stub ( exif , 'ExifImage' ) . callsFake (
2015-05-10 20:27:35 +02:00
function ( arg1 , arg2 ) {
arg2 ( null , gpsmsg ) ;
} ) ;
helper . load ( exifNode , flow , function ( ) {
var exifNode1 = helper . getNode ( "exifNode1" ) ;
var helperNode1 = helper . getNode ( "helperNode1" ) ;
setTimeout ( function ( ) {
var logEvents = helper . log ( ) . args . filter ( function ( evt ) {
return evt [ 0 ] . type == "exif" ;
} ) ;
logEvents . should . have . length ( 1 ) ;
logEvents [ 0 ] [ 0 ] . should . have . a . property ( 'msg' ) ;
logEvents [ 0 ] [ 0 ] . msg . toString ( ) . should . startWith ( "Invalid longitude data," ) ;
exif . ExifImage . restore ( ) ;
done ( ) ;
} , 150 ) ;
exifNode1 . receive ( { payload : data } ) ;
} ) ;
} ) ;
it ( 'should report if unsure about location' , function ( done ) {
var exif = require ( 'exif' ) ;
var ExifImage = exif . ExifImage ;
2017-06-24 14:53:22 +02:00
var data = new Buffer . from ( "hello" ) ;
2015-05-10 20:27:35 +02:00
var eD ;
var flow = [ { id : "exifNode1" , type : "exif" , wires : [ [ "helperNode1" ] ] } ,
{ id : "helperNode1" , type : "helper" } ] ;
var gpsmsg = { gps : { GPSLatitudeRef : 'N' ,
GPSLatitude : [ 50 , 57 , 1.3 ] ,
GPSAltitudeRef : 0 ,
GPSAltitude : 50 ,
GPSTimeStamp : [ 7 , 32 , 2 ] }
} ;
2018-05-02 14:53:04 +02:00
var spy = sinon . stub ( exif , 'ExifImage' ) . callsFake (
2015-05-10 20:27:35 +02:00
function ( arg1 , arg2 ) {
arg2 ( null , gpsmsg ) ;
} ) ;
helper . load ( exifNode , flow , function ( ) {
var exifNode1 = helper . getNode ( "exifNode1" ) ;
var helperNode1 = helper . getNode ( "helperNode1" ) ;
setTimeout ( function ( ) {
var logEvents = helper . log ( ) . args . filter ( function ( evt ) {
return evt [ 0 ] . type == "exif" ;
} ) ;
logEvents . should . have . length ( 1 ) ;
logEvents [ 0 ] [ 0 ] . should . have . a . property ( 'msg' ) ;
logEvents [ 0 ] [ 0 ] . msg . toString ( ) . should . startWith ( "The location of this image cannot be determined safely" ) ;
exif . ExifImage . restore ( ) ;
done ( ) ;
} , 150 ) ;
exifNode1 . receive ( { payload : data } ) ;
} ) ;
} ) ;
2014-11-04 16:07:32 +01:00
} ) ;