Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix raise condition in testCloudantAction.js. #283

Merged
merged 1 commit into from
Nov 16, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
259 changes: 157 additions & 102 deletions tests/dat/cloudant/testCloudantAction.js
Original file line number Diff line number Diff line change
@@ -1,130 +1,185 @@
const nodeRuntime = process.version.startsWith('v8.') ? 'nodejs8' : 'nodejs10'
const isNodeJS8 = nodeRuntime === 'nodejs8' ? true : false
//var Cloudant = isNodeJS8 ? require("cloudant") : require("@cloudant/cloudant")
// get the actual node version
var nodeRuntime="unsupported";
switch (true) {
case process.version.startsWith("v10."): nodeRuntime = "nodejs10"; break;
case process.version.startsWith("v12."): nodeRuntime = "nodejs12"; break;
case process.version.startsWith("v16."): nodeRuntime = "nodejs16"; break;
case process.version.startsWith("v20."): nodeRuntime = "nodejs20"; break;
}

if (process.version.startsWith('v8.')) {
var Cloudant = require("cloudant")
} else if (process.version.startsWith('v16.') || process.version.startsWith('v20.')) {
// load the cloudant package
if (process.version.startsWith('v16.') || process.version.startsWith('v20.')) {
console.log("------------------------- require @ibm-cloud/cloudant ----------------------");
var { CloudantV1 } = require('@ibm-cloud/cloudant');
} else {
var Cloudant = require("@cloudant/cloudant")
}

function main(args){
// delete database
async function deleteDatabase(client,databaseName) {
try {
console.log("Deleting possible existing database: "+databaseName);
const response= await client.deleteDatabase({db: databaseName});
console.log("Returned from deleteDatabase response: %j",response);
} catch (err) {
if (err.status = 404) {
// Database not found, we tolerate this for the delete.
console.log("Database not found, ignored during deleteDatabase.");
} else {
// Other errors, progagte this to caller.
throw new Error('Delete database failed!', { cause: err });
};
}
return true;
}

// create database
async function createDatabase(client,databaseName) {
try {
console.log("Creating database: "+databaseName);
const response= await client.putDatabase({ db: databaseName });
console.log("Returned from putDatabase")
if (response.result.ok) {
console.log(`"${databaseName}" database created."`);
} else {
throw new Error('Error for client.putDatabase, response.result.ok=true expected!', {cause: response });
}
} catch (err) {
console.log("Error for client.putDatabase: %j",err);
throw new Error('Error for client.putDatabase!', { cause: err });
}
return true;
}

// post a document into the database
async function postDocument(client,databaseName,doc) {
try {
console.log("writing document to database: "+databaseName);
const response= await client.postDocument({db: databaseName, document: doc})
console.log("Returned from postDocument")
if (response.result.ok) {
console.log(`"${databaseName}" document written."`);
} else {
throw new Error('Error for client.postDocument, response.result.ok=true expected!', {cause: response });
}
} catch (err) {
console.log("Error for client.postDocument: %j",err);
throw new Error('Error for client.putDatabase!', { cause: err });
}
return true;
}

// get a document from database
async function getDocument(client,databaseName,id) {
var document={};
try {
console.log("Get document from database: "+databaseName);
const response= await client.getDocument({db: databaseName, docId: id})
console.log("Returned from getDocument, response: %j",response)
if (response.statusText='OK') {
console.log(`"${databaseName}" document "${id}" successfully read."`);
document=response.result;
} else {
throw new Error('Error for client.getDocument, response.statusText=OK expected!', {cause: response });
}
} catch (err) {
console.log("Error for client.getDocument: %j",err);
throw new Error('Error for client.getDocument!', { cause: err });
}
return document;
}

// main action
async function main(args) {
var username = args.username;
var password = args.password;
var url = args.url;
var dbName = `test_cloud_functions_nodejs_${nodeRuntime}_ibm_runtime`

console.log("runtime: "+nodeRuntime)
console.log("database name: "+dbName)
console.log("username: "+username)

if (process.version.startsWith('v16.') || process.version.startsWith('v20.')) {
process.env['CLOUDANT_AUTH_TYPE'] = 'BASIC'
process.env['CLOUDANT_URL'] = url
process.env['CLOUDANT_USERNAME'] = username
process.env['CLOUDANT_PASSWORD'] = password

// 1. Create a client with `CLOUDANT` default service name
// Create a client with `CLOUDANT` default service name
const client = CloudantV1.newInstance({});
// Create DB
const createDb = client.putDatabase({ db: dbName })
.then((putDatabaseResult) => {
if (putDatabaseResult.result.ok) {
console.log(`"${dbName}" database created."`);
}
})
.catch((err) => {
if (err.code === 412) {
console.log(
`Cannot create "${dbName}" database, it already exists.`
);
}
});

var friendinfo;
// Writte to DB
return createDb.then(() => {
client
.postDocument({
db: dbName,
document: {
"_id" : 'friend1',
"firstname": "Suzzy",
"lastname": "Queue"
}
})
.then((createDocumentResponse) => {
rev = createDocumentResponse.result.rev;
console.log('You have created the document:\n');
});
}).then(() => {
// call service with predefined parameters:
console.log('client.getDocument:\n');
return client.getDocument({db: dbName, docId: 'friend1'}).then((document) => {
return document;
});
}).then((data) => {
friendinfo = data
console.log('client.deleteDatabase friend=',friendinfo);
return client.deleteDatabase({db: dbName}) //.then((db) => {return db})
}).then(function(){
console.log('return the document=', friendinfo);
//return the document fetched from the db
return friendinfo;
}).catch(function(err){
console.log('error received:', err);
//If an error occurrs at any part in execution; return error
return {err: err}
})

//fetch from DB
// Delete a possible existing database from a previous run.
const delDB= await deleteDatabase(client,dbName);

// Create a database.
const createDB= await createDatabase(client,dbName);
console.log("createDatabase returned:"+createDB);

// Post a document into the new database.
const doc={
"_id" : 'friend1',
"firstname": "Suzzy",
"lastname": "Queue"
}
const postDoc= await postDocument(client,dbName,doc);
console.log("postDocument returned:"+postDoc)

// Read the document from the database.
const getDoc= await getDocument(client,dbName,'friend1');
console.log("getDocument returned: %j",getDoc)

// const delDB2= await deleteDatabase(client,dbName);

// Return the document read from the database.
return getDoc;

} else {
//Configuration to use Cloudant
var config = {account:username, password:password}
isNodeJS8 ? config.plugin='promises' : config.plugins=['promises']
var cloudant = Cloudant(config);

var beforeAction = new Promise(function(resolve ,reject){
cloudant.db.destroy(dbName)
.then(function(){
console.log("Previous database with name: "+dbName+"existed; it was cleaned up so that tests can run");
return resolve();
})
.catch(function(){
return resolve();
})
});

//Create the cloudant database
return beforeAction.then(function(){
return cloudant.db.create(dbName)
})
.then(function(data){
//Switch to use that newly created database.
return cloudant.db.use(dbName);
})
.then(function(db){
var friendinfo;
//Inject a json document named friend1 into the database.
return db.insert({firstname: "Suzzy", lastname: "Queue"}, 'friend1')
.then(function(){
//fetch the newly injected document from the database
return db.get('friend1');

//Configuration to use Cloudant
var config = {account:username, password:password, plugins:['promises']}
var cloudant = Cloudant(config);

var beforeAction = new Promise(function(resolve ,reject){
cloudant.db.destroy(dbName)
.then(function(){
console.log("Previous database with name: "+dbName+"existed; it was cleaned up so that tests can run");
return resolve();
})
.catch(function(){
return resolve();
})
});

//Create the cloudant database
return beforeAction.then(function(){
return cloudant.db.create(dbName)
})
.then(function(data){
friendinfo = data;
//destroy the database
return cloudant.db.destroy(dbName);
//Switch to use that newly created database.
return cloudant.db.use(dbName);
})
.then(function(){
//return the document fetched from the db
return friendinfo;
.then(function(db){
var friendinfo;
//Inject a json document named friend1 into the database.
return db.insert({firstname: "Suzzy", lastname: "Queue"}, 'friend1')
.then(function(){
//fetch the newly injected document from the database
return db.get('friend1');
})
.then(function(data){
friendinfo = data;
//destroy the database
return cloudant.db.destroy(dbName);
})
.then(function(){
//return the document fetched from the db
return friendinfo;
})
})
.catch(function(err){
//If an error occurrs at any part in execution; return error
return {err: err}
})
})
.catch(function(err){
//If an error occurrs at any part in execution; return error
return {err: err}
})
}
}
}