2014-11-04 16:07:32 +01:00
2021-01-14 14:26:49 +01:00
// var should = require("should");
2014-11-04 16:07:32 +01:00
var sinon = require ( 'sinon' ) ;
2021-01-14 14:26:49 +01: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' ) ;
2021-01-14 14:26:49 +01:00
// var exif = require('exif');
var path = require ( "path" ) ;
var image = fs . readFileSync ( path . join ( _ _dirname , "test.jpeg" ) ) ;
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 ) {
2021-01-14 14:26:49 +01:00
//var ExifImage = exif.ExifImage;
2014-11-04 16:07:32 +01:00
// 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
2021-01-14 14:26:49 +01:00
var flow = [ { id : "exifNode1" , type : "exif" , mode : "normal" , property : "payload" , wires : [ [ "helperNode1" ] ] } ,
2020-12-06 18:34:27 +01:00
{ id : "helperNode1" , type : "helper" } ] ;
2015-02-05 14:52:20 +01:00
2021-01-14 14:26:49 +01: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' }
// };
// var stub = sinon.stub(exif, 'ExifImage').callsFake(function(arg1,arg2) {
// console.log("DING",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 ) {
2021-01-14 14:26:49 +01:00
// exif.ExifImage.restore();
msg . location . lat . should . equal ( 51.04365 ) ; // this data is stored in the jpg file
msg . location . lon . should . equal ( - 1.31525 ) ;
2015-03-31 14:18:25 +02:00
done ( ) ;
} ) ;
2021-01-14 14:26:49 +01:00
exifNode1 . receive ( { payload : image } ) ;
2015-05-10 20:27:35 +02:00
} ) ;
} ) ;
2021-01-14 14:26:49 +01:00
it . skip ( 'extracts location data in Southern and Eastern hemispheres' , function ( done ) {
2015-05-10 20:27:35 +02:00
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" ] ] } ,
2020-12-06 18:34:27 +01:00
{ id : "helperNode1" , type : "helper" } ] ;
2015-05-10 20:27:35 +02:00
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' }
} ;
2021-01-14 14:26:49 +01: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 ) {
2021-01-14 14:26:49 +01:00
exif . ExifImage . restore ( ) ;
2015-05-10 20:27:35 +02:00
msg . location . lat . should . equal ( - 50.95624 ) ; // this data is stored in the jpg file
msg . location . lon . should . equal ( 1.36701 ) ;
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 flow = [ { id : "exifNode1" , type : "exif" , wires : [ [ "helperNode1" ] ] } ,
2020-12-06 18:34:27 +01:00
{ id : "helperNode1" , type : "helper" } ] ;
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" ;
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 flow = [ { id : "exifNode1" , type : "exif" , wires : [ [ "helperNode1" ] ] } ,
2020-12-06 18:34:27 +01:00
{ 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" ) ;
2021-01-14 14:26:49 +01:00
var flow = [ { id : "exifNode1" , type : "exif" , property : "payload" , wires : [ [ "helperNode1" ] ] } ,
2020-12-06 18:34:27 +01:00
{ id : "helperNode1" , type : "helper" } ] ;
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' ) ;
2021-01-14 14:26:49 +01:00
logEvents [ 0 ] [ 0 ] . msg . toString ( ) . should . startWith ( "No input received, " ) ;
2015-03-31 14:18:25 +02:00
done ( ) ;
} , 150 ) ;
exifNode1 . receive ( { topic : data } ) ;
} ) ;
2014-11-04 16:07:32 +01:00
} ) ;
2015-05-10 20:27:35 +02:00
2021-01-14 14:26:49 +01:00
it . skip ( 'should report if bad latitude' , function ( done ) {
2015-05-10 20:27:35 +02:00
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 flow = [ { id : "exifNode1" , type : "exif" , wires : [ [ "helperNode1" ] ] } ,
2020-12-06 18:34:27 +01:00
{ id : "helperNode1" , type : "helper" } ] ;
2015-05-10 20:27:35 +02:00
var gpsmsg = { gps : { GPSLatitudeRef : 'N' ,
GPSLatitude : [ 50 , 57 ] ,
GPSLongitudeRef : 'W' ,
GPSLongitude : [ 1 , 22 , 1.2467 ] ,
GPSAltitudeRef : 0 ,
GPSAltitude : 50 ,
GPSTimeStamp : [ 7 , 32 , 2 ] }
} ;
2021-01-14 14:26:49 +01: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" ) ;
setTimeout ( function ( ) {
2021-01-14 14:26:49 +01:00
exif . ExifImage . restore ( ) ;
2015-05-10 20:27:35 +02:00
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," ) ;
done ( ) ;
} , 150 ) ;
exifNode1 . receive ( { payload : data } ) ;
} ) ;
} ) ;
2021-01-14 14:26:49 +01:00
it . skip ( 'should report if bad longitude' , function ( done ) {
2015-05-10 20:27:35 +02:00
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" ] ] } ,
2020-12-06 18:34:27 +01:00
{ id : "helperNode1" , type : "helper" } ] ;
2015-05-10 20:27:35 +02:00
var gpsmsg = { gps : { GPSLatitudeRef : 'N' ,
GPSLatitude : [ 50 , 57 , 1.3 ] ,
GPSLongitudeRef : 'W' ,
GPSLongitude : [ 1 , 22 ] ,
GPSAltitudeRef : 0 ,
GPSAltitude : 50 ,
GPSTimeStamp : [ 7 , 32 , 2 ] }
} ;
2021-01-14 14:26:49 +01: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" ) ;
setTimeout ( function ( ) {
2021-01-14 14:26:49 +01:00
exif . ExifImage . restore ( ) ;
2015-05-10 20:27:35 +02:00
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," ) ;
done ( ) ;
} , 150 ) ;
exifNode1 . receive ( { payload : data } ) ;
} ) ;
} ) ;
2021-01-14 14:26:49 +01:00
it . skip ( 'should report if unsure about location' , function ( done ) {
2015-05-10 20:27:35 +02:00
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" ] ] } ,
2020-12-06 18:34:27 +01:00
{ id : "helperNode1" , type : "helper" } ] ;
2015-05-10 20:27:35 +02:00
var gpsmsg = { gps : { GPSLatitudeRef : 'N' ,
GPSLatitude : [ 50 , 57 , 1.3 ] ,
GPSAltitudeRef : 0 ,
GPSAltitude : 50 ,
GPSTimeStamp : [ 7 , 32 , 2 ] }
} ;
2021-01-14 14:26:49 +01: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" ) ;
setTimeout ( function ( ) {
2021-01-14 14:26:49 +01:00
exif . ExifImage . restore ( ) ;
2015-05-10 20:27:35 +02:00
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" ) ;
done ( ) ;
} , 150 ) ;
exifNode1 . receive ( { payload : data } ) ;
} ) ;
} ) ;
2014-11-04 16:07:32 +01:00
} ) ;