Getting ready to publish
This commit is contained in:
		
							parent
							
								
									0e8a2bbd2c
								
							
						
					
					
						commit
						d638d813f7
					
				
							
								
								
									
										27
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
			
		||||
{
 | 
			
		||||
    // Use IntelliSense to learn about possible attributes.
 | 
			
		||||
    // Hover to view descriptions of existing attributes.
 | 
			
		||||
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
 | 
			
		||||
    "version": "0.2.0",
 | 
			
		||||
    "configurations": [
 | 
			
		||||
        
 | 
			
		||||
        {
 | 
			
		||||
            "type": "node",
 | 
			
		||||
            "request": "launch",
 | 
			
		||||
            "name": "Launch Program",
 | 
			
		||||
            "skipFiles": [
 | 
			
		||||
                "<node_internals>/**"
 | 
			
		||||
            ],
 | 
			
		||||
            "program": "${workspaceFolder}\\src\\main.js"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type": "node",
 | 
			
		||||
            "request": "launch",
 | 
			
		||||
            "name": "Test Program",
 | 
			
		||||
            "skipFiles": [
 | 
			
		||||
                "<node_internals>/**"
 | 
			
		||||
            ],
 | 
			
		||||
            "program": "${workspaceFolder}\\src\\TenorJSv2.test.js"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								.vscode/snips.code-snippets
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								.vscode/snips.code-snippets
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
			
		||||
{
 | 
			
		||||
	// Place your custom-scripts workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and 
 | 
			
		||||
	// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope 
 | 
			
		||||
	// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is 
 | 
			
		||||
	// used to trigger the snippet and the body will be expanded and inserted. Possible variables are: 
 | 
			
		||||
	// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. 
 | 
			
		||||
	// Placeholders with the same ids are connected.
 | 
			
		||||
	// Example:
 | 
			
		||||
	// "Print to console": {
 | 
			
		||||
	// 	"scope": "javascript,typescript",
 | 
			
		||||
	// 	"prefix": "log",
 | 
			
		||||
	// 	"body": [
 | 
			
		||||
	// 		"console.log('$1');",
 | 
			
		||||
	// 		"$2"
 | 
			
		||||
	// 	],
 | 
			
		||||
	// 	"description": "Log output to console"
 | 
			
		||||
	// }
 | 
			
		||||
 | 
			
		||||
	"Banner Comment": {
 | 
			
		||||
		"scope": "javascript,typescript",
 | 
			
		||||
		"description": "Banner Comment",
 | 
			
		||||
		"prefix": "///",
 | 
			
		||||
		"body": [
 | 
			
		||||
			"// #############################################################",
 | 
			
		||||
			"// $1",
 | 
			
		||||
			"// #############################################################",
 | 
			
		||||
			"$2"
 | 
			
		||||
		]
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										128
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,128 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "tenorjs-v2",
 | 
			
		||||
  "version": "1.0.0",
 | 
			
		||||
  "lockfileVersion": 3,
 | 
			
		||||
  "requires": true,
 | 
			
		||||
  "packages": {
 | 
			
		||||
    "": {
 | 
			
		||||
      "name": "tenorjs-v2",
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "axios": "^1.7.7",
 | 
			
		||||
        "dotenv": "^16.4.5"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/asynckit": {
 | 
			
		||||
      "version": "0.4.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
 | 
			
		||||
      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/axios": {
 | 
			
		||||
      "version": "1.7.7",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
 | 
			
		||||
      "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "follow-redirects": "^1.15.6",
 | 
			
		||||
        "form-data": "^4.0.0",
 | 
			
		||||
        "proxy-from-env": "^1.1.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/combined-stream": {
 | 
			
		||||
      "version": "1.0.8",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 | 
			
		||||
      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "delayed-stream": "~1.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.8"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/delayed-stream": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=0.4.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/dotenv": {
 | 
			
		||||
      "version": "16.4.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
 | 
			
		||||
      "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
 | 
			
		||||
      "license": "BSD-2-Clause",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://dotenvx.com"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/follow-redirects": {
 | 
			
		||||
      "version": "1.15.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
 | 
			
		||||
      "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
 | 
			
		||||
      "funding": [
 | 
			
		||||
        {
 | 
			
		||||
          "type": "individual",
 | 
			
		||||
          "url": "https://github.com/sponsors/RubenVerborgh"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=4.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependenciesMeta": {
 | 
			
		||||
        "debug": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/form-data": {
 | 
			
		||||
      "version": "4.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "asynckit": "^0.4.0",
 | 
			
		||||
        "combined-stream": "^1.0.8",
 | 
			
		||||
        "mime-types": "^2.1.12"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/mime-db": {
 | 
			
		||||
      "version": "1.52.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
 | 
			
		||||
      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/mime-types": {
 | 
			
		||||
      "version": "2.1.35",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
 | 
			
		||||
      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "mime-db": "1.52.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/proxy-from-env": {
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "tenorjs-v2",
 | 
			
		||||
  "version": "1.0.1",
 | 
			
		||||
  "description": "A crappy wrapper for Tenor.com API",
 | 
			
		||||
  "main": "./src/index.js",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "test": "node ./src/test.js"
 | 
			
		||||
  },
 | 
			
		||||
  "repository": {
 | 
			
		||||
    "type": "git",
 | 
			
		||||
    "url": "https://git.vfsh.dev/voidf1sh/tenorjs-v2"
 | 
			
		||||
  },
 | 
			
		||||
  "keywords": [
 | 
			
		||||
    "tenor",
 | 
			
		||||
    "gif"
 | 
			
		||||
  ],
 | 
			
		||||
  "author": "Skylar Grant",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "axios": "^1.7.7",
 | 
			
		||||
    "dotenv": "^16.4.5"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -1,27 +0,0 @@
 | 
			
		||||
module.exports = class Request {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        this.completed = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get(url, callback) {
 | 
			
		||||
        const request = new XMLHttpRequest();
 | 
			
		||||
 | 
			
		||||
        // Set up the callback for when the response comes in
 | 
			
		||||
        request.onreadystatechange = () => {
 | 
			
		||||
            if (request.readyState === 4) {
 | 
			
		||||
                this.completed = true;
 | 
			
		||||
                if (request.status === 200) {
 | 
			
		||||
                    callback(null, request.responseText);
 | 
			
		||||
                } else {
 | 
			
		||||
                    callback(new Error(`Request failed with status ${request.status}: ${request.statusText}`), null);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Open the request, as asynchronous
 | 
			
		||||
        request.open("GET", url, true);
 | 
			
		||||
 | 
			
		||||
        // Send the request
 | 
			
		||||
        request.send(null);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,59 +0,0 @@
 | 
			
		||||
const Request = require('./Request');
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    Tenor: class Tenor {
 | 
			
		||||
        constructor(tenorApiKey) {
 | 
			
		||||
            this.token = tenorApiKey;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        async configure() {
 | 
			
		||||
            // Sanity tests
 | 
			
		||||
            if (!this.token) {
 | 
			
		||||
                throw new Error('No API key provided');
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Search with an invalid key
 | 
			
		||||
            try {
 | 
			
		||||
                const response = await this.search('invalid', 'query', 1);
 | 
			
		||||
                if (response.code !== 16) {
 | 
			
		||||
                    throw new Error('Unexpected response from known-bad API query.');
 | 
			
		||||
                }
 | 
			
		||||
            } catch (error) {
 | 
			
		||||
                throw new Error(`Error searching with invalid key: ${error.message}`);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Search with a valid key
 | 
			
		||||
            try {
 | 
			
		||||
                const response = await this.search(this.token, 'cat', 1);
 | 
			
		||||
                if (response.code === 16) {
 | 
			
		||||
                    throw new Error(response.error);
 | 
			
		||||
                } else if (response.results.length !== 1) {
 | 
			
		||||
                    throw new Error('Unexpected response from known-good API query.');
 | 
			
		||||
                }
 | 
			
		||||
            } catch (error) {
 | 
			
		||||
                throw new Error(`Error searching with valid key: ${error.message}`);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        search(token, query, limit) {
 | 
			
		||||
            return new Promise((resolve, reject) => {
 | 
			
		||||
                // Form the search url
 | 
			
		||||
                const searchUrl = `https://g.tenor.com/v1/search?q=${query}&key=${token}&limit=${limit}`;
 | 
			
		||||
            
 | 
			
		||||
                // Submit the search
 | 
			
		||||
                new Request().get(searchUrl, (error, response) => {
 | 
			
		||||
                    if (error) {
 | 
			
		||||
                        return reject(new Error(`Error fetching GIFs: ${error.message}`));
 | 
			
		||||
                    }
 | 
			
		||||
                    try {
 | 
			
		||||
                        // Parse the json response
 | 
			
		||||
                        const responseJson = JSON.parse(response);
 | 
			
		||||
                        resolve(responseJson);
 | 
			
		||||
                    } catch (parseError) {
 | 
			
		||||
                        reject(new Error(`Error parsing response: ${parseError.message}`));
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										109
									
								
								src/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								src/index.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,109 @@
 | 
			
		||||
// #############################################################
 | 
			
		||||
// Module Imports
 | 
			
		||||
// #############################################################
 | 
			
		||||
const axios = require('axios');
 | 
			
		||||
 | 
			
		||||
// #############################################################
 | 
			
		||||
// Variables
 | 
			
		||||
// #############################################################
 | 
			
		||||
const baseUrl = "https://tenor.googleapis.com/v2/search?";
 | 
			
		||||
 | 
			
		||||
class Request {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        this.completed = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get(url) {
 | 
			
		||||
        return new Promise(async (resolve, reject) => {
 | 
			
		||||
            axios.get(url).then((response) => {
 | 
			
		||||
                this.completed = true;
 | 
			
		||||
                resolve(response.data);
 | 
			
		||||
            }).catch((error) => {
 | 
			
		||||
                this.completed = true;
 | 
			
		||||
                reject(error);
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class Tenor {
 | 
			
		||||
    constructor(tenorApiKey) {
 | 
			
		||||
        this.token = tenorApiKey;
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async configure() {
 | 
			
		||||
        return new Promise((resolve, reject) => {
 | 
			
		||||
            if (!this.token) {
 | 
			
		||||
                return reject(new Error('No API key provided'));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this.search('cat', 1).then((gifs) => { // Search with a valid key
 | 
			
		||||
                if (gifs.length !== 1) { // Check for a valid response
 | 
			
		||||
                    return reject(new Error('Unexpected response from known-good API query.'));
 | 
			
		||||
                } else { // Key is valid
 | 
			
		||||
                    resolve('Tenor API key is valid and API is working correctly.');
 | 
			
		||||
                }
 | 
			
		||||
            }).catch((error) => {
 | 
			
		||||
                if (error.response && error.response.status === 401) {
 | 
			
		||||
                    return reject(new Error(`Invalid API Key`));
 | 
			
		||||
                } else {
 | 
			
		||||
                    return reject(error);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    search(query, options) {
 | 
			
		||||
        return new Promise((resolve, reject) => {
 | 
			
		||||
            // Form the search url
 | 
			
		||||
            let searchUrl = baseUrl + `q=${query}`;
 | 
			
		||||
            searchUrl += `&key=${this.token}`;
 | 
			
		||||
            if (options) {
 | 
			
		||||
                if (typeof options === 'number') {
 | 
			
		||||
                    searchUrl += `&limit=${options}`;
 | 
			
		||||
                } else if (typeof options === 'object') {
 | 
			
		||||
                    if (options.limit) searchUrl += `&limit=${options.limit}`; // Default 20 max 50
 | 
			
		||||
                    if (options.clientKey) searchUrl += `&client_key=${options.clientKey}`;
 | 
			
		||||
                    if (options.random) searchUrl += `&random=${options.random}`;
 | 
			
		||||
                    if (options.position) searchUrl += `&pos=${options.position}`;
 | 
			
		||||
                    if (options.country) searchUrl += `&country=${options.country}`;
 | 
			
		||||
                    if (options.locale) searchUrl += `&locale=${options.locale}`;
 | 
			
		||||
                    if (options.mediaFilter) searchUrl += `&media_filter=${options.mediaFilter}`;
 | 
			
		||||
                    if (options.contentFilter) searchUrl += `&contentfilter=${options.contentFilter}`;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            // Submit the search
 | 
			
		||||
            new Request().get(searchUrl).then((response) => {
 | 
			
		||||
                // Validate the results
 | 
			
		||||
                if (!response.results || response.results.length === 0) {
 | 
			
		||||
                    return reject(new Error('No results found'));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Create object to store results
 | 
			
		||||
                const gifs = [];
 | 
			
		||||
                // Manipulate the results
 | 
			
		||||
                for (const gif of response.results) {
 | 
			
		||||
                    gifs.push(new Gif(gif));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Return the results
 | 
			
		||||
                resolve(gifs);
 | 
			
		||||
            }).catch(error => {
 | 
			
		||||
                return reject(error);
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class Gif {
 | 
			
		||||
    constructor(gif) {
 | 
			
		||||
        this.url = gif.url;
 | 
			
		||||
        this.id = gif.id;
 | 
			
		||||
        this.created = gif.created;
 | 
			
		||||
        this.mediaUrl = gif.media_formats.gif.url;
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = Tenor;
 | 
			
		||||
							
								
								
									
										45
									
								
								src/main.js
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								src/main.js
									
									
									
									
									
								
							@ -1,45 +0,0 @@
 | 
			
		||||
// callback for the top 8 GIFs of search
 | 
			
		||||
function tenorCallback_search(responsetext)
 | 
			
		||||
{
 | 
			
		||||
    // parse the json response
 | 
			
		||||
    var response_objects = JSON.parse(responsetext);
 | 
			
		||||
 | 
			
		||||
    top_10_gifs = response_objects["results"];
 | 
			
		||||
 | 
			
		||||
    // load the GIFs -- for our example we will load the first GIFs preview size (nanogif) and share size (tinygif)
 | 
			
		||||
 | 
			
		||||
    document.getElementById("preview_gif").src = top_10_gifs[0]["media"][0]["nanogif"]["url"];
 | 
			
		||||
 | 
			
		||||
    document.getElementById("share_gif").src = top_10_gifs[0]["media"][0]["tinygif"]["url"];
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// function to call the trending and category endpoints
 | 
			
		||||
function grab_data()
 | 
			
		||||
{
 | 
			
		||||
    // set the apikey and limit
 | 
			
		||||
    var apikey = "LIVDSRZULELA";
 | 
			
		||||
    var lmt = 8;
 | 
			
		||||
 | 
			
		||||
    // test search term
 | 
			
		||||
    var search_term = "excited";
 | 
			
		||||
 | 
			
		||||
    // using default locale of en_US
 | 
			
		||||
    var search_url = "https://g.tenor.com/v1/search?q=" + search_term + "&key=" +
 | 
			
		||||
            apikey + "&limit=" + lmt;
 | 
			
		||||
 | 
			
		||||
    httpGetAsync(search_url,tenorCallback_search);
 | 
			
		||||
 | 
			
		||||
    // data will be loaded by each call's callback
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// SUPPORT FUNCTIONS ABOVE
 | 
			
		||||
// MAIN BELOW
 | 
			
		||||
 | 
			
		||||
// start the flow
 | 
			
		||||
grab_data();
 | 
			
		||||
							
								
								
									
										70
									
								
								src/test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								src/test.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,70 @@
 | 
			
		||||
const Tenor = require('.');
 | 
			
		||||
const dotenv = require('dotenv').config();
 | 
			
		||||
 | 
			
		||||
if (process.env.TENOR_API_KEY === undefined) {
 | 
			
		||||
    console.error('Please set TENOR_API_KEY in .env');
 | 
			
		||||
    process.exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const tests = [
 | 
			
		||||
    // Valid API Key
 | 
			
		||||
    new Promise((resolve, reject) => {
 | 
			
		||||
        const tenor = new Tenor(process.env.TENOR_API_KEY);
 | 
			
		||||
        tenor.configure()
 | 
			
		||||
            .then((result) => {
 | 
			
		||||
                console.log('PASS: Valid API Key --', result);
 | 
			
		||||
                resolve();
 | 
			
		||||
            })
 | 
			
		||||
            .catch((error) => {
 | 
			
		||||
                console.error('FAIL: Valid API Key --', error.message);
 | 
			
		||||
                reject();
 | 
			
		||||
            });
 | 
			
		||||
    }),
 | 
			
		||||
    // Invalid API Key
 | 
			
		||||
    new Promise((resolve, reject) => {
 | 
			
		||||
        const tenor = new Tenor('invalidApiKey');
 | 
			
		||||
        tenor.configure()
 | 
			
		||||
            .then((result) => {
 | 
			
		||||
                console.log('FAIL: Invalid API Key');
 | 
			
		||||
                reject();
 | 
			
		||||
            })
 | 
			
		||||
            .catch((error) => {
 | 
			
		||||
                console.error('PASS: Invalid API Key --', error.response.data.error.message);
 | 
			
		||||
                resolve();
 | 
			
		||||
            });
 | 
			
		||||
    }),
 | 
			
		||||
    // Valid query and limit
 | 
			
		||||
    new Promise((resolve, reject) => {
 | 
			
		||||
        const tenor = new Tenor(process.env.TENOR_API_KEY);
 | 
			
		||||
        // Form the options for the search
 | 
			
		||||
        const options = {
 | 
			
		||||
            limit: 5
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        if (process.env.TENOR_CLIENT_KEY) {
 | 
			
		||||
            options.clientKey = process.env.TENOR_CLIENT_KEY;
 | 
			
		||||
        }
 | 
			
		||||
        tenor.search('dog', options)
 | 
			
		||||
        .then((gifs) => {
 | 
			
		||||
            if (Array.isArray(gifs) && gifs.length === 5) {
 | 
			
		||||
                console.log('PASS: valid query and limit --', gifs); // Expected output: Array of five Gif objects
 | 
			
		||||
                resolve();
 | 
			
		||||
            } else {
 | 
			
		||||
                console.error('FAIL: valid query and limit --', 'Unexpected response format'); // Show only the FAIL message
 | 
			
		||||
                reject();
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
        .catch((error) => {
 | 
			
		||||
            console.error('FAIL: valid query and limit --', error.message); // Show only the FAIL message
 | 
			
		||||
            reject();
 | 
			
		||||
        });
 | 
			
		||||
    })
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
Promise.all(tests)
 | 
			
		||||
    .then(() => {
 | 
			
		||||
        console.log('All tests passed!');
 | 
			
		||||
    })
 | 
			
		||||
    .catch(() => {
 | 
			
		||||
        console.log('Some tests failed!');
 | 
			
		||||
    });
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user